crestinul: Trigggerul dml de update sa se declanseze pentru fiecare rand sau o singura data la nivel de statmenent se poate configura asta?
Multumesc
Triggeri DML sunt la nivel de statement. În sintaxa comenzii CREATE TRIGGER din T-SQL (SQL Server) nu există nici un element care să permită configurarea modului de activare a triggerilor așa cum există FOR EACH ROW în MySQL (doar la nivel de row - conform documentației) sau ORACLE (la nivel de statement sau row - conform documentației). În plus, syntaxa
T-SQL folosită de către Sybase Anywhere/ASE include sintaxa
[ FOR EACH { ROW | STATEMENT } ].Un test demonstrează comportamentul serverului în acest caz:
CREATE TABLE TestTrigger
(
Id INT IDENTITY PRIMARY KEY,
Col1 INT NOT NULL,
Col2 VARCHAR(20) NULL
);
GO
CREATE TRIGGER trg_IUD_TestTrigger
ON TestTrigger
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SELECT i.Id AS inserted_id, i.Col1 AS inserted_Col1, i.Col2 AS inserted_Col2
FROM inserted i;
SELECT i.Id AS deleted_id, i.Col1 AS deleted_Col1, i.Col2 AS deleted_Col2
FROM deleted i;
END;
GO
--TRUNCATE TABLE TestTrigger
PRINT '--Test 1--';
INSERT TestTrigger(Col1, Col2)
VALUES (11, 'A');
PRINT '--Test 2--';
INSERT TestTrigger(Col1, Col2)
SELECT 22, 'B'
UNION ALL
SELECT 33, 'C';
PRINT '--Test 3--';
UPDATE TestTrigger
SET Col2 = NULL;
--Rezultate
--Test 1--
inserted_id inserted_Col1 inserted_Col2
----------- ------------- --------------------
1 11 A
deleted_id deleted_Col1 deleted_Col2
----------- ------------ --------------------
--Test 2--
inserted_id inserted_Col1 inserted_Col2
----------- ------------- --------------------
3 33 C
2 22 B
deleted_id deleted_Col1 deleted_Col2
----------- ------------ --------------------
--Test 3--
inserted_id inserted_Col1 inserted_Col2
----------- ------------- --------------------
3 33 NULL
2 22 NULL
1 11 NULL
deleted_id deleted_Col1 deleted_Col2
----------- ------------ --------------------
3 33 C
2 22 B
1 11 A