Definition: Was ist ein Auslöser? In SQL Server handelt es sich um ein Programm, das eine bestimmte Operation für eine bestimmte Tabelle ausführt, eine bestimmte Bedingung auslöst und ausgeführt wird. Ein Trigger ist eine spezielle gespeicherte Prozedur.
Es gibt drei häufige Auslöser: Sie werden jeweils auf Einfügungs-, Aktualisierungs- und Löschereignisse angewendet.
Warum sollte ich Trigger verwenden? Zum Beispiel diese beiden Tabellen:
Create Table Student( --学生表 StudentID int primary key, --学号 .... )
Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... )
Die verwendeten Funktionen sind:
1. Wenn ich den Studentenausweis des Studenten ändere, hoffe ich, dass sein Ausleihdatensatz weiterhin mit dem Studenten verknüpft ist (d. h. die Ausleihdatensatztabelle wird es sein). gleichzeitig die Studentennummer geändert);
2. Wenn der Student seinen Abschluss gemacht hat, hoffe ich, seine Studentennummer und auch seinen Buchausleihdatensatz zu löschen.
Warte.
Zu diesem Zeitpunkt können Sie Trigger verwenden. Erstellen Sie für 1 einen Update-Trigger:
Trigger truStudent erstellen
On Student – Erstellen Sie einen Trigger in der Student-Tabelle
für Was als Nächstes zu tun ist
wenn Update(StudentID)
begin
BorrowRecord aktualisieren
StudentID=i.StudentID setzen
Aus BorrowRecord br , gelöscht d ,eingefügt i --Gelöschte und eingefügte temporäre Tabelle
Wobei br.StudentID=d.StudentID
Ende
Verstehen Sie die beiden temporären Tabellen im Trigger: Gelöscht, Eingefügt. Beachten Sie, dass „Gelöscht“ und „Eingefügt“ jeweils den „alten Datensatz“ und den „neuen Datensatz“ der Tabelle darstellen, die das Ereignis ausgelöst hat.
In einem Datenbanksystem gibt es zwei virtuelle Tabellen, die zum Speichern der Informationen verwendet werden, die die Änderungen in der Tabelle aufzeichnen, nämlich:
Virtuelle Tabelle Eingefügte virtuelle Tabelle gelöscht
Speicherung neuer Ergänzungen, wenn neue Tabellenaufzeichnungen erfolgen werden hinzugefügt, neu hinzugefügte Neuzugänge. Die Datensätze speichern den Datensatz nicht. Speichern Sie beim Ändern die neuen Datensätze, die zum Aktualisieren verwendet werden, und speichern Sie den Datensatz vor der Aktualisierung.
Datensätze anzeigen, wenn sie gelöscht werden: Neue Datensätze zum Eingefügten generieren kopieren Sie die alten Datensätze in die Tabelle „Gelöscht“, löschen Sie dann den Datensatz „Student“ und schreiben Sie den neuen Datensatz.
Für 2 einen Löschauslöser erstellen
Auslöser erstellen trdStudent
Auf Student
zum Löschen
Als
BorrowRecord löschen
Aus BorrowRecord br , Delted d
Wobei br.StudentID=d.StudentID
Anhand dieser beiden Beispiele können wir den Schlüssel zu Triggern erkennen: A. 2 temporäre Tabellen; B. Triggermechanismus.
SQL-Trigger-Instanz 2
/*
Richten Sie eine virtuelle Testumgebung ein, einschließlich: Tabelle [Zigaretteninventartabelle], Tabelle [Zigarettenverkaufstabelle].
Bitte achten Sie darauf, die Daten dieser beiden Tabellen zu verfolgen und zu verstehen, welche Geschäftslogik der Trigger ausführt und welche Auswirkungen dies auf die Daten hat.
Um die Rolle von Triggern klarer auszudrücken, weist die Tabellenstruktur Datenredundanz auf und entspricht nicht der dritten Normalform. Dies wird hiermit erklärt.
*/
USE Master
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'Cigarette Inventory Table')
DROP TABLE Cigarette Inventory Table
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'Cigarette Sales Table')
DROP TABLE Cigarette Sales Table
GO
--Business Regel: Verkaufsbetrag = Verkaufsmenge * Verkaufseinheitspreis-Geschäftsregel.
TABELLE Zigarettenverkaufstabelle erstellen
(
Zigarettenmarke VARCHAR(40) PRIMARY KEY NOT NULL,
Käufer VARCHAR(40) NULL,
Verkaufsmenge INT NULL,
Verkaufseinheitspreis MONEY NULL,
Verkaufsmenge MONEY NULL
)
GO
--Geschäftsregeln: Lagerbestandsmenge = Lagerbestandsmenge * Lagerbestandspreis pro Einheit Geschäftsregeln.
TABELLE ERSTELLEN Zigarettenbestandstabelle
(
Zigarettenmarke VARCHAR(40) PRIMÄRSCHLÜSSEL NICHT NULL,
Bestandsmenge INT NULL,
Bestandsstückpreis MONEY NULL,
Bestand Betrag GELD NULL
)
GO
--Trigger erstellen, Beispiel 1
/*
Trigger erstellen [T_INSERT_cigarette inventory table], dieser Trigger ist einfacher.
Beschreibung: Immer wenn eine INSERT-Aktion in der [Zigaretteninventartabelle] auftritt, wird dieser Auslöser ausgelöst.
Trigger-Funktion: Erzwingen Sie Geschäftsregeln, um sicherzustellen, dass in den eingefügten Daten Bestandsmenge = Bestandsmenge * Bestandsstückpreis ist.
Hinweis: [INSERTED] und [DELETED] sind Systemtabellen und können nicht erstellt, geändert oder gelöscht, aber aufgerufen werden.
Wichtig: Die Struktur dieser beiden Systemtabellen ist dieselbe wie die Struktur der Tabelle, in die Daten eingefügt werden.
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE T_INSERT_Cigarette Inventory Table
ON Cigarette Inventory Table
FOR INSERT
AS
– Transaktionsverarbeitung senden
BEGIN TRANSACTION
– Erzwingen Sie die Ausführung der folgenden Anweisungen, um Geschäftsregeln sicherzustellen
Zigaretten-Inventartabelle aktualisieren
Inventarmenge festlegen = Inventarmenge * Inventar-Stückpreis
WHERE Zigarettenmarke IN (Zigarettenmarke von EINGEFÜGT AUSWÄHLEN)
TRANSAKTION COMMIT
GO
/ *
Testdaten für [Zigaretteninventartabelle] einfügen:
Beachten Sie, dass die Daten im ersten Datenelement (Hongtashan New Force) den Geschäftsregeln entsprechen.
Im zweiten Datenelement (Hongtashan Human Peak) , [Inventarmenge] ist leer, was nicht den Geschäftsregeln entspricht
Im dritten Datenelement (Yunnan-Bild) ist [Inventarmenge] nicht gleich [Inventarmenge] multipliziert mit [Inventarstückpreis]. , was nicht den Geschäftsregeln entspricht.
Die vierte Datenbestandsmenge ist 0.
Bitte beachten Sie, dass Sie nach dem Einfügen der Daten prüfen müssen, ob die Daten in der [Zigaretten-Bestandstabelle] Bestandsmenge = Bestandsmenge * Bestandsstückpreis sind.
*/
INS Zigarette-Inventartabelle einfügen (Zigarettenmarke, Inventarmenge, Inventarstückpreis, Inventarmenge)
WÄHLEN Sie „Hongtashan New Force“,100,12,1200 UNION ALL
SELECT 'Hongtashan Artificial Peak',100,22,NULL UNION ALL
SELECT 'Yunnan Image',100,60,500 UNION ALL
SELECT 'Yuxi',0,30,0
GO
--Abfragedaten
SELECT * FROM Cigarette inventory table
GO
/*
Result set
RecordId Cigarette Brand Inventory Quantity Inventory Unit Price Inventory Amount
-------- ---------------- -------- ------- -------- -
1 Hongta Mountain Neue Kräfte 100 12.0000 1200.0000
2 Hongtashan künstlicher Gipfel 100 22.0000 2200.0000
3 Yunnan Bild 100 60.0000 6000.0000
4 Yuxi 0 30.0000 . 0000
(Die Anzahl der betroffene Zeilen sind 4 Zeilen)
*/
--Trigger-Beispiel 2
/*
Erstellen Sie einen Trigger [T_INSERT_Cigarette Sales Table], der komplexer ist.
Beschreibung: Immer wenn eine INSERT-Aktion in der [Zigaretteninventurtabelle] auftritt, wird dieser Auslöser ausgelöst.
Trigger-Funktion: Geschäftsregeln implementieren.
Geschäftsregeln: Wenn die verkaufte Zigarettenmarke nicht auf Lager ist oder der Lagerbestand Null ist, wird ein Fehler zurückgegeben.
Andernfalls werden die Lagermenge und die Menge der entsprechenden Zigarettenmarke in der [Zigaretten-Bestandstabelle] automatisch reduziert.
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE T_INSERT_Cigarette Sales Table
ON Cigarette Sales Table
FOR INSERT
AS
BEGIN TRANSACTION
--Überprüfen Sie die Rechtmäßigkeit der Daten: ob die verkauften Zigaretten auf Lager sind, oder ob der Lagerbestand größer ist als Null
WENN NICHT EXISTIERT (
SELECT inventurmenge
FROM zigarette inventar tabelle
WHERE zigarette marke IN (SELECT zigarette marke FROM INSERTED)
)
BEGIN
-- Zurück Fehlermeldung
RAISERROR('Fehler! Diese Zigarette ist nicht auf Lager und kann nicht verkauft werden.',16,1)
--Rollback-Transaktion
ROLLBACK
RETURN
END
IF EXISTS (
SELECT Stock Quantity
FROM Cigarette Stock List
WHERE Cigarette Brand IN (SELECT Cigarette Brand FROM INSERTED) AND
Stock Quantity 0ebf3d377fd2045f5041d7fc892aca89@newcjmc
begin
in die Werte von t_modifylog (wtbh, mod_time, mod_table, mod_field, ori_value, now_value, mod_people) einfügen (@wtbh,getdate(), 'chl_lydj','cjmc', @oldcjmc, @newcjmc , @xgr)
end
end
//////////修改时,直接把'create'改为'alter'即可
//////////////////////////
CREATE TRIGGER [TRIGGER ly_tzk_syf] ON dbo.ly_tzk
FOR insertAS
begindeclare @clmc char(100) declare @dwbh char(100) declare @syf char(100) declare @ dwgcbh char(100) declare @wtbh char(50)
declare @dj_1 money declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money declare @dj char(20)
select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@syf=syf from inserted
select @dj=dj from feihao_bz wo clmc=@clmc
select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_x f, @feiyong_sy=feiyong_sy von gongchengxinxi wo dwgcbh=@dwbh
set @dj_1=convert(money ,@dj)
if @dj_1 a8093152e673feb7aba1828c435320940
begin
set @feiyong_xf=@feiyong_xf+@dj_1
set @feiyong_sy=@feiyong_sy- @dj_1
update ly_tzk set syf=@dj where wtbh=@wtbh
update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong _sy=@feiyong_sy where dwgcbh=@dwbh
end
else update ly_tzk set syf=convert(char , 0.0) wo wtbh=@wtbh
end
/////////// ///////////
CREATE TRIGGER [TRIGGER ly_tzk_syf_shanchu] ON dbo.ly_tzk
FOR delete
AS
begin
declare @clmc char(100) declare @dwbh char(100) declare @dwgcbh char(100) declare @wtbh char(50)
declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money
declare @syf char( 100) declare @syf_1 money
--declare @dj char(20) declare @dj_1 money
select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@sy f=syf von eingefügt
--select @dj=dj from feihao_bz where clmc=@clmc
select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy from gongchengxinxi where dwgcbh=@dwbh
set @syf_1=convert(money ,@syf)
if @syf_1 a8093152e673feb7aba1828c435320940
begin
set @feiyong_xf=@feiyong_xf-@syf_1
set @feiyong_sy=@feiyong_sy+@syf_1
update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy where dwgcbh=@dwbh
Ende
Ende