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 комментарий:

Andrey Zaytsev комментирует...

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