web-dev-qa-db-fra.com

Obtenir le nom de nom de table actuel a été viré sur

Mon système: DB2 11.1 sur Linux.

1.Créez une table:

create table admin.tab (a int not null primary key, b int) @

2.Créez la table d'audit:

create table admin.audit (table_name varchar(2000), datetime timestamp) @

3.Très très simple échantillon, lors de l'insérer dans la table source admin.tab Je voudrais insérer dans admin.audit:

create trigger admin.mytrig
after insert on admin.tab
referencing new as new
for each row
begin
    insert into admin.audit (table_name, datetime) 
       values ('admin.tab', current_timestamp);
end
@

4.Above Trigger fonctionne bien, mais y a-t-il une manière dans la gâchette ci-dessus, je peux remplacer "admin.tab" constante avec le nom de la table actuelle qui a été tiré à l'aide de la gâchette, comme CURRENT_TABLE_TRIGGER_WAS_FIRED_ON ou quelque chose?

create trigger admin.mytrig
after insert on admin.tab
referencing new as new
for each row
begin
    insert into admin.audit (table_name, datetime) 
       values (CURRENT_TABLE_TRIGGER_WAS_FIRED_ON, current_timestamp);
end
@

J'ai besoin de ce genre de solution, car j'ai besoin de créer des centaines de tels déclencheurs et de partager autant de code que possible économise beaucoup de temps.

2
folow

Vous seriez mieux servi en générant vos déclencheurs requis avec un code de relevé composé de DB2 SQL tel que celui-ci.

BEGIN
    FOR C AS cur CURSOR WITH HOLD FOR
        SELECT        'CREATE TRIGGER "'  || RTRIM(TABSCHEMA) || '"."' || TABNAME || '_TRIG"'
        || CHR(10) || 'AFTER INSERT ON "' || RTRIM(TABSCHEMA) || '"."' || TABNAME || '"'
        || CHR(10) || 'REFERENCING NEW AS NEW FOR EACH ROW'
        || CHR(10) || 'INSERT INTO ADMIN.AUDIT VALUES (''' || TABSCHEMA || ''',''' || TABNAME || ''', CURRENT_TIMESTAMP )'
            AS STMT
        FROM
            SYSCAT.TABLES
        WHERE
            TABSCHEMA = 'PAUL'
        AND TYPE      = 'T'
        AND TABLEORG  = 'R'
        AND (TABSCHEMA, TABNAME || '_TRIG') NOT IN (SELECT TRIGSCHEMA, TRIGNAME FROM SYSCAT.TRIGGERS)
        ORDER BY 
            TABSCHEMA
        ,   TABNAME
    DO
          EXECUTE IMMEDIATE C.STMT;
    END FOR;
END
0
Paul Vernon