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.
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