1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| create or replace procedure PCD_TEST_GRANTS( psOrdre VARCHAR2, psDate DATE )
IS
-- PRAGMA AUTONOMOUS_TRANSACTION; -- N.B. : A priori, je dois inhiber cette commande, sinon elle prends un temps fou !!!
BEGIN
insert into ref.TEST values(psOrdre, psDate);
EXECUTE IMMEDIATE psOrdre;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.Put_Line(SQLERRM(SQLCODE));
END PCD_TEST_GRANTS;
- Le Trigger qui l'utilise :
CREATE OR REPLACE TRIGGER TRG_TEST_GRANTS
AFTER CREATE ON SCHEMA
declare
-- Variables de travail
vType VARCHAR2(20);
vName VARCHAR2(50);
vOwner VARCHAR2(30);
vOrdre VARCHAR2(150);
vdate DATE;
vRefType VARCHAR2(20) := 'TABLE';
begin
-- Requête pour connaître l'objet à traiter
select SUBSTR(ora_dict_obj_name,1,50), LTRIM(RTRIM(ora_dict_obj_type)), LTRIM(RTRIM(ora_dict_obj_owner))
into vName, vType, vOwner
from dual;
-- La date courante
select sysdate into vDate from dual;
-- Donner les droits ?
if vOwner = 'REF' and vType = vRefType then
-- Ordre des droits en lecture
vOrdre := 'grant select on ' || vOwner || '.' || vName || ' to public';
-- Appel de la procédure pour exécuter l'ordre
PCD_TEST_GRANTS (vOrdre, vDate);
-- Ordre de la création du synonyme
vOrdre := 'create public synonym ' || vName || ' for ' || vOwner || '.' || vName ;
-- Appel de la procédure pour exécuter l'ordre
PCD_TEST_GRANTS (vOrdre, vDate);
end if;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.Put_Line(SQLERRM(SQLCODE));
END TRG_TEST_GRANTS;
Mais lorsque j'exécute une série de commandes pour déclancher le Trigger :
truncate table ref.test
/
drop table ref.tempo
/
create table ref.tempo ( Champ1 varchar2(255))
/
select * from ref.test
/ |
Partager