I have modified the existing DBC.Users view to display details of all users, rather than just of the user executing the query (which is how DBC.Users works). This is handy to keep in your own database, or a shared DBA database, because it has more informtion that DBC.Databases.
REPLACE VIEW Users AS SELECT CAST(TRANSLATE(dbase.DatabaseName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED UserName), CAST(TRANSLATE(dbase.CreatorName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED CreatorName), /* DR101935-jw180009-01-> */ CAST(dbase.PasswordModTime AS DATE) AS PasswordLastModDate, CAST(dbase.PasswordModTime AS TIME(0)) AS PasswordLastModTime, /* <-DR101935-jw180009-01 */ CAST(TRANSLATE(dbase.OwnerName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED OwnerName), dbase.PermSpace(FORMAT '---,---,---,---,--9'), COALESCE(PF.SpoolSpace, dbase.SpoolSpace)(FORMAT '---,---,---,---,--9') (NAMED SpoolSpace), COALESCE(PF.TempSpace, dbase.TempSpace)(FORMAT '---,---,---,---,--9') (NAMED TempSpace), dbase.ProtectionType, dbase.JournalFlag, dbase.StartupString, CAST(TRANSLATE(COALESCE(PF.DefaultAccount, dbase.AccountName) USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED DefaultAccount), CAST(TRANSLATE(COALESCE(PF.DefaultDataBase, dbase.DefaultDataBase) USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED DefaultDataBase), dbase.CommentString, dbase.DefaultCollation, /*+-----------------------------------------------------+ | PasswordChgDate converted from Julian to YY/MM/DD | +-----------------------------------------------------+ */ CASE WHEN DBASE.PasswordChgDate < 0 THEN NULL ELSE (((100 * ((4 * NULLIFZERO(DBASE.PasswordChgDate) - 1) / 146097) + (4 * (((4 * DBASE.PasswordChgDate - 1) MOD 146097) / 4) + 3) / 1461 - 1900) + ((5 * (((4 * (((4 * DBASE.PasswordChgDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) / 153 + 2) / 12) * 10000 + (((5 * (((4 * (((4 * DBASE.PasswordChgDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) / 153 + 2) MOD 12 + 1) * 100 + ((5 * (((4 * (((4 * DBASE.PasswordChgDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) MOD 153 +5) / 5 (DATE, FORMAT 'yy/mm/dd')) END AS PasswordChgDate, /*+------------------------------------------------+ | LockedDate converted from Julian to YY/MM/DD | +------------------------------------------------+ */ ((100 * ((4 * DBASE.LockedDate - 1) / 146097) + (4 * (((4 * DBASE.LockedDate - 1) MOD 146097) / 4) + 3) / 1461 - 1900) + ((5 * (((4 * (((4 * DBASE.LockedDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) / 153 + 2) / 12) * 10000 + (((5 * (((4 * (((4 * DBASE.LockedDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) / 153 + 2) MOD 12 + 1) * 100 + ((5 * (((4 * (((4 * DBASE.LockedDate - 1) MOD 146097) / 4) + 3) MOD 1461 + 4) / 4) - 3) MOD 153 +5) / 5 (DATE, FORMAT 'yy/mm/dd', NAMED LockedDate), /*+------------------------------------------------+ | Lockedtime converted from minutes to HH:MM | +------------------------------------------------+*/ (Dbase.LockedTime / 60 ) * 100 +(Dbase.LockedTime MOD 60) (INTEGER, FORMAT '99:99', NAMED LockedTime), dbase.LockedCount, dbase.TimeZoneHour, dbase.TimeZoneMinute, dbase.DefaultDateForm, dbase.CreateTimeStamp, CAST(TRANSLATE(DB2.DatabaseName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED LastAlterName), dbase.LastAlterTimeStamp, dbase.DefaultCharType, CAST(TRANSLATE(dbase.RoleName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED RoleName), CAST(TRANSLATE(dbase.ProfileName USING UNICODE_TO_LOCALE WITH ERROR) AS CHAR(30)) (NAMED ProfileName), dbase.AccessCount, dbase.LastAccessTimeStamp FROM DBC.dbase LEFT OUTER JOIN DBC.Profiles PF ON DBC.Dbase.ProfileName = PF.ProfileNameI LEFT OUTER JOIN DBC.Dbase DB2 ON DBC.dbase.LastAlterUID = DB2.DatabaseID WHERE dbase.DatabaseId IN (/* IDs of users controlled by this USER */ SELECT dbase.DatabaseId FROM DBC.dbase WHERE dbase.RowType = 'U' -- AND -- (/* I AM the user */ -- (dbase.DataBaseNameI = USER)) --UNION ALL --SELECT dbase.DatabaseId -- FROM DBC.dbase, DBC.owners -- WHERE dbase.RowType = 'U' -- AND -- /* I own the user */ -- (dbase.DatabaseId = owners.owneeid -- AND owners.ownerid = (SEL DISTINCT -- databaseid FROM DBC.dbase WHERE -- databasenamei=USER)) --UNION ALL --SELECT dbase.DatabaseId -- FROM DBC.dbase, DBC.accessrights, DBC.userdbV -- WHERE dbase.RowType = 'U' -- AND ( -- /* I have explicit modify rights on user */ -- (dbase.DatabaseId = accessrights.DatabaseId -- AND (accessrights.accessright = 'DD' -- OR accessrights.accessright = 'DU') -- AND accessrights.UserId = userdbV.id -- AND userdbV.name=USER)) ) WITH CHECK OPTION;
Written for Teradata 13.10
Pingback: Cloning users from one system to another | Teradata DBA Tips and Tricks