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