2017-07-03

Generate create user statement

BEGIN
dbms_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
END;
/

WITH usr AS ( 
  SELECT ',USER1,USER2,' usr FROM dual
  ),
statements(txt, username, ord) AS (  
  SELECT dbms_metadata.get_ddl('USER', username), username, 1 AS ord
  FROM dba_users u, usr WHERE usr LIKE '%,' || username || ',%'
  UNION ALL
  SELECT dbms_metadata.GET_GRANTED_DDL('ROLE_GRANT', username), username, 2 AS ord
  FROM dba_users u, usr WHERE usr LIKE '%,' || username || ',%' 
    AND EXISTS (SELECT NULL FROM dba_role_privs WHERE grantee = username)
  UNION ALL
  SELECT dbms_metadata.GET_GRANTED_DDL('SYSTEM_GRANT', username), username, 3 AS ord
  FROM dba_users u, usr WHERE usr LIKE '%,' || username || ',%'
   AND EXISTS (SELECT NULL FROM dba_sys_privs WHERE grantee = username)
  UNION ALL
  SELECT dbms_metadata.GET_GRANTED_DDL('OBJECT_GRANT', username), username, 4 AS ord
  FROM dba_users u, usr WHERE usr LIKE '%,' || username || ',%'
   AND EXISTS (SELECT NULL FROM dba_tab_privs WHERE grantee = username)
  )
SELECT txt
FROM statements
ORDER BY username, ord
;

1 комментарий:

  1. Here https://www.thatjeffsmith.com/archive/2019/02/generating-user-ddl-in-sqlcl/ is you can find updated query for generating:

    SELECT DBMS_METADATA.GET_DDL(
    'USER',
    :NAME
    )
    FROM DUAL
    UNION ALL
    SELECT DBMS_METADATA.GET_GRANTED_DDL(
    'ROLE_GRANT',
    GRANTEE
    )
    FROM DBA_ROLE_PRIVS
    WHERE GRANTEE = :NAME
    AND ROWNUM = 1
    UNION ALL
    SELECT DBMS_METADATA.GET_GRANTED_DDL(
    'SYSTEM_GRANT',
    GRANTEE
    )
    FROM DBA_SYS_PRIVS SP,
    SYSTEM_PRIVILEGE_MAP SPM
    WHERE SP.GRANTEE = :NAME
    AND SP.PRIVILEGE = SPM.NAME
    AND SPM.PROPERTY <> 1
    AND ROWNUM = 1
    UNION ALL
    SELECT DBMS_METADATA.GET_GRANTED_DDL(
    'OBJECT_GRANT',
    GRANTEE
    )
    FROM DBA_TAB_PRIVS
    WHERE GRANTEE = :NAME
    AND ROWNUM = 1

    ОтветитьУдалить