Heim >php教程 >PHP开发 >Beispiele für SQL-Trigger erklärt

Beispiele für SQL-Trigger erklärt

高洛峰
高洛峰Original
2016-12-14 16:07:091180Durchsuche

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 insert 

AS

begin

         declare @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


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn