* Versão do Oracle: 11g Enterprise Edition Release 11.1.0.6.0
* Sistema Operacional: Windows Server 2003
Eu tenho 2 schemas assim: MATRIZ e FILIAL, o usuario Matriz dá grants de select, update... para o usuario Filial que possui synonyms para acessar essas tabelas.
Foi realizado um export desses 2 usuarios para criar um ambiente de testes: MATRIZ_TEST e FILIAL_TEST.
Depois de realizada a importação o usuário MATRIZ_TEST tem os grants para o usuario FILIAL(esses devem ser alterados para FILIAL_TEST). O usuário FILIAL_TEST possui synonyms apontando para o usuário MATRIZ(esses devem apontar agora para MATRIZ_TEST).
Nunca fiz algo assim, tentei montar um script para fazer isso, mas algumas packages não consegui compilar porque da um erro de que a tabela não existe, mas o sinônimo está criado. Está certo isso que estou tentando fazer?
DECLARE
v_GRANTEE NUMBER;
v_SEQ NUMBER;
BEGIN
--ALTERANDO OS SINONIMOS
FOR X IN (SELECT o.obj# obj, o.name name, s.owner owner
FROM sys.syn$ s, sys."_CURRENT_EDITION_OBJ" o
WHERE o.obj# = s.obj#
AND o.type# = 5
AND o.owner# = (SELECT USER#
FROM USER$
WHERE NAME = 'FILIAL_TEST')) LOOP
UPDATE sys.syn$
SET OWNER = 'MATRIZ_TEST'
WHERE obj# = X.obj;
END LOOP;
--USUARIO QUE IRA RECEBER OS GRANTS
SELECT USER#
INTO v_GRANTEE
FROM USER$
WHERE NAME = 'FILIAL_TEST';
--REPLICANDO GRANTS
FOR X IN (SELECT OA.OBJ# OBJ, OA.GRANTOR# GRANTOR, OA.SEQUENCE# OASEQ,
O.NAME oname, TPM.NAME privname, UR.NAME ugo, UE.NAME uge
FROM sys.objauth$ oa, sys."_CURRENT_EDITION_OBJ" o, sys.user$ u,
sys.user$ ur, sys.user$ ue, table_privilege_map tpm
WHERE oa.obj# = o.obj#
AND oa.grantor# = ur.user#
AND oa.grantee# = ue.user#
AND oa.col# IS NULL
AND oa.privilege# = tpm.privilege
AND u.user# = o.owner#
AND ur.name = 'MATRIZ_TEST'
AND ue.name = 'FILIAL') LOOP
--Atualiza com o novo usuário
UPDATE objauth$
SET GRANTEE# = v_GRANTEE
WHERE OBJ# = X.OBJ
AND SEQUENCE# = X.OASEQ;
END LOOP;
COMMIT;
END;