Мар 222011
 

Если нам нужно создать пустую схему в новой базе данных, которая бы полностью наследовала права доступа, системные привилегии и роли другой схемы в существующей базе, то экспортом это делать неудобно и долго, гораздо проще создать нового пользователя и дать ему необходимые права. Список прав получим с помощью специального запроса (см. ниже). Полный набор прав доступа хранится в трёх представлениях словаря данных: dba_tab_privs, dba_sys_privs, и dba_role_privs, в которых нас прежде всего интересует столбец GRANTEE, где и содержится имя пользователя, которому даётся привилегия. Поэтому нам понадобятся 3 запроса, результаты которых мы для удобства объединим в одно множество с помощью оператора объединения множеств - UNION.

Итак, запрос:

SELECT 
	'GRANT '      || 
	tp.privilege  || 
	' ON '        || 
	tp.owner      ||
	'.'           || 
	tp.table_name ||
	' TO '        || 
	tp.grantee    || 
	';' cmd
FROM dba_tab_privs tp 
	WHERE tp.grantee = 'CUBE'
 
UNION
 
SELECT 
	'GRANT '     || 
	sp.privilege || 
	' TO '       || 
	sp.grantee   || 
	DECODE(sp.admin_option, 'YES', ' WITH ADMIN OPTION;', ';')
FROM dba_sys_privs sp 
	WHERE sp.grantee = 'CUBE'
 
UNION
 
SELECT 
	'GRANT '        || 
	rp.granted_role || 
	' TO '          || 
	rp.grantee      || 
	DECODE(rp.admin_option, 'YES', ' WITH ADMIN OPTION;', ';')
FROM dba_role_privs rp 
	WHERE rp.grantee = 'CUBE'
/

Этот запрос вернёт нам набор команд, которые просто надо будет выполнить на целевой базе.

Если имя пользователя на целевой БД должно отличаться от имени пользователя на исходной базе (в нашем примере нового юзера зовут NEW_CUBE), то запрос будет таким:

SELECT 
	'GRANT '      || 
	tp.privilege  || 
	' ON '        || 
	tp.owner      ||
	'.'           || 
	tp.table_name ||
	' TO '        || 
	'NEW_CUBE'    || 
	';' cmd
FROM dba_tab_privs tp 
	WHERE tp.grantee='CUBE'
 
UNION
 
SELECT 
	'GRANT '     || 
	sp.privilege || 
	' TO '       || 
	'NEW_CUBE'   || 
	DECODE(sp.admin_option, 'YES', ' WITH ADMIN OPTION;', ';')
FROM dba_sys_privs sp 
	WHERE sp.grantee='CUBE'
 
UNION
 
SELECT 
	'GRANT '        || 
	rp.granted_role || 
	' TO '          || 
	'NEW_CUBE'      || 
	DECODE(rp.admin_option, 'YES', ' WITH ADMIN OPTION;', ';')
FROM dba_role_privs rp 
	WHERE rp.grantee='CUBE'
/

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)