SQL Server Trigger după actualizare pentru o anumită valoare
By: Dallas Snider | Updated: 2015-09-10 | Comments (6) | Related: More> Triggers
problemă
am nevoie pentru a crea un trigger SQL Server care va executa atunci când o valoare coloană este actualizat la o anumită valoare. Cum pot face asta?
soluție
în acest sfat, vă arătăm cum să scrieți instrucțiuni T-SQL care vor crea un declanșator SQLServer care se va executa după ce actualizăm o valoare a coloanei la o valoare specifică.
în imaginea de mai jos vedem unde creăm tabelul nostru de exemplu numit Tbltriggertest cu o coloană cheie primară numită pkID, o coloană de dată numită OrderApprovalDateTime și o coloană varchar numită OrderStatus. Populăm tabelul cu trei înregistrări de testare cu OrderApprovalDateTime setat la NULL și OrderStatus setat la”în așteptare”.
În acest exemplu, dorim ca declanșatorul nostru să populeze OrderApprovalDateTime cu data curentă furnizată de funcția getdate() după ce OrderStatus este actualizat la „aprobat”. T-SQL pentru crearea acestui declanșator este prezentat mai jos. Este foarte important să includeți îmbinarea interioară la tabelul inserat, astfel încât să fie afectate numai rândurile actualizate. Utilizarea clauzei unde OrderStatus = ‘Approved’ de la sine pentru a limita rândurile actualizate va duce de fapt la toate rândurile cu o valoare OrderStatus de Approved fiind actualizate în același timp.
pentru a testa declanșatorul, vom executa o instrucțiune de actualizare T-SQL pentru a seta valoarea OrderStatus la „aprobat” pentru primul rând din tabel (pkID = 1). După comanda de actualizare T-SQL, executăm apoi o interogare de selectare T-SQL pentru a ne asigura că declanșatorul a fost executat corect. Ieșirea din instrucțiunile actualizare și selectare este prezentată mai jos.
observați mai sus că numai primul rând a avut OrderApprovalDateTime setat la data curentă, care este comportamentul nostru dorit. Cu toate acestea, avem nevoie pentru a rula un al doilea test pentru a se asigura că numărul corect de rânduri au fost actualizate. În al doilea test, vom executa o instrucțiune de actualizare T-SQL pentru a seta valoarea OrderStatus la „aprobat” pentru al doilea rând din tabel (pkID = 2). După selectarea tuturor înregistrărilor din tabel, observați cum OrderApprovalDateTime pentru al doilea rând nu este egal cu OrderApprovalDateTime pentru primul rând. Din nou, acesta este comportamentul nostru dorit și totul pare bine.
codul complet pentru acest sfat este în caseta de mai jos.
use MSSQLTipsgocreate table tblTriggerTest( pkID integer Identity(1,1) primary key, OrderApprovalDateTime datetime, OrderStatus varchar(20))insert into tblTriggerTest values (NULL, 'Pending')insert into tblTriggerTest values (NULL, 'Pending')insert into tblTriggerTest values (NULL, 'Pending')select * from tblTriggerTestgocreate trigger trTriggerTest on tblTriggerTestafter updateasbegin set nocount on; update tblTriggerTest set OrderApprovalDateTime=getdate() from tblTriggerTest t inner join inserted i on t.pkID=i.pkID and i.OrderStatus='Approved'endgoupdate tblTriggerTest set OrderStatus='Approved' where pkID=1goselect * from tblTriggerTestgoupdate tblTriggerTest set OrderStatus='Approved' where pkID=2goselect * from tblTriggerTestgo
pașii următori
luați câteva minute pentru a explora ce se întâmplă atunci când schimbați asocierea interioară sau adăugați mai multe coloane în tabel și declanșați.
de asemenea, a verifica afară mai multe sfaturi ontriggers în SQL Server pe MSSQLTips.com.
- forțarea de declanșare pentru ardere în SQL Server
- preveni actualizarea accidentală sau șterge comenzi de toate rândurile într-un tabel SQL Server
- audit atunci când declanșatoare sunt dezactivate sau activate pentru SQL Server
Ultima actualizare: 2015-09-10
despre autor
Vezi toate sfaturile mele
- Mai multe sfaturi pentru dezvoltatori de baze de date…
Leave a Reply