Bonjours

J'ai la table

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE TABLE matable
(
  "CODE_POSTAL" CHAR(5 BYTE),
  "NOM" VARCHAR2(38 BYTE),
  "INSERT_DATE" DATE,
  "UPDATE_DATE" DATE
)
sur la quelle je veux créer un trigger dynamiquement.

Dans un 1er temps,

Quand je fais

Code 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
create or replace
TRIGGER UPDATE_matable_TRIGGER
BEFORE UPDATE ON matable
FOR EACH ROW
BEGIN
  SELECT SYSDATE INTO :new.UPDATE_DATE FROM DUAL;
END;
ça marche!

Quand je fais

Code 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
begin
EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER UPDATE_matable_TRIGGER BEFORE UPDATE ON matable FOR EACH ROW BEGIN
  SELECT SYSDATE INTO :new.UPDATE_DATE FROM DUAL;END;';
end;/
ça marche!

Mais que je met ce code dans une procédure stocké d'un package
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
PROCEDURE create_update_trigger(tableName IN VARCHAR2) IS
BEGIN
  EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER UPDATE_' || tableName || '_TRIGGER BEFORE UPDATE ON ' || tableName || ' FOR EACH ROW
    BEGIN
      SELECT SYSDATE INTO :new.UPDATE_DATE FROM DUAL;
    END;';
EXCEPTION
  WHEN OTHERS THEN RAISE;
END create_update_trigger;
et que je fais appel à cette procédure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
begin
  UPDATER.create_update_trigger('matable');
end;
/
on me réponds:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
01031. 00000 -  "insufficient privileges"


Ce que je ne comprend pas c'est pourquoi.

Car j'arrive très bien a créer un trigger sur cette table
que ce soit avec le code 1 ou le code 2;

Mais dès que je veux passé par une procédure stocké,
ça ne marche plus, et ne je vois pas pourquoi le problème viendrais des droits
Car ce sont tous des objets d'un même schéma (MON schéma)

Quelqu'un peut-il me dire où est la faute?