>Ho una tabella con campo1,campo2,campo3,
>vorrei creare un trigger in update che quando modifico il campo1= 'F'
>nello stesso record che sto aggiornado mi mette 'OK' nel campo2.
Ciao Marco,
Osserva il seguente esempio:
USE tempdb;
CREATE TABLE dbo.foo(
c1 char(1) NOT NULL,
c2 char(2) NOT NULL,
c3 int NOT NULL,
CONSTRAINT PK_foo PRIMARY KEY(c3)
);
INSERT dbo.foo VALUES
('A', 'AA', 1)
, ('B', 'BB', 2)
, ('C', 'CC', 3);
GO
CREATE TRIGGER dbo.trU_foo
ON dbo.foo
FOR UPDATE
AS
IF EXISTS(
SELECT *
FROM INSERTED
WHERE c1 = 'F'
)
BEGIN
UPDATE F
SET c2 = 'OK'
FROM dbo.foo AS F
JOIN INSERTED AS I
ON F.c3 = I.c3
WHERE I.c1 = 'F';
END
GO
/* Aggiorno una singola riga */
UPDATE dbo.foo
SET c1 = 'F'
WHERE c3 = 1;
SELECT *
FROM dbo.foo;
/* Output:
c1 c2 c3
---- ---- -----------
F OK 1
B BB 2
C CC 3
(3 row(s) affected)
*/
/* Aggiorno più righe */
UPDATE dbo.foo
SET c1 = 'F'
WHERE c3 IN(2, 3);
SELECT *
FROM dbo.foo;
/* Output:
c1 c2 c3
---- ---- -----------
F OK 1
F OK 2
F OK 3
(3 row(s) affected)
*/
DROP TABLE dbo.foo;
Come puoi vedere, il trigger di update prima di tutto verifica se nella tabella virtuale INSERTED esiste almeno una riga con c1 = 'F' e se c'è aggiorna la colonna c2 della tabella base delle righe corrispondente.
Dai BOL: "The inserted table stores copies of the affected rows during INSERT and UPDATE statements. During an insert or update transaction, new rows are added to both the inserted table and the trigger table. The rows in the inserted table are copies of the new rows in the trigger table".
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org