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

Beispiele für SQL-Trigger erklärt

高洛峰
Freigeben: 2016-12-14 16:07:09
Original
1234 Leute haben es durchsucht

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,       --学号 
        .... 
       )
Nach dem Login kopieren
      Create Table BorrowRecord(               --学生借书记录表 
        BorrowRecord   int identity(1,1),       --流水号   
        StudentID      int ,                    --学号 
        BorrowDate     datetime,                --借出时间 
        ReturnDAte     Datetime,                --归还时间 
        ... 
      )
Nach dem Login kopieren

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 <= 0
)
BEGIN
--Fehlermeldung zurückgeben
RAISERROR('Fehler! Der Zigarettenbestand ist kleiner oder gleich 0 und kann nicht verkauft werden.',16,1)
--Rollback-Transaktion
ROLLBACK
RETURN
END

--Verarbeiten Sie rechtliche Daten

--Erzwingen Sie die folgenden Anweisungen, um Geschäftsregeln sicherzustellen
AKTUALISIEREN Sie die Zigarettenverkaufstabelle
SET Verkaufsbetrag = Verkaufsmenge * Verkaufseinheitspreis
WHERE Cigarette Brand IN (SELECT Cigarette Brand FROM INSERTED)

DECLARE @Cigarette Brand VARCHAR(40)
SET @Cigarette Brand = (SELECT Cigarette Brand FROM INSERTED)

DECLARE @Sales Quantity MONEY
SET @Sales Quantity = (SELECT Sales Quantity FROM INSERTED)

UPDATE Cigarette Inventory Table
SET Inventory Quantity = Inventory Quantity - @Sales Quantity,
Bestandsmenge = (Bestandsmenge - @Verkaufsmenge)*Bestandsstückpreis
WHERE Cigarette Brand = @Cigarette Brand
TRANSACTION COMMIT
GO

--Bitte behalten Sie den Überblick über [Zigarettenbestandsliste ] und [Zigaretten] selbst Verkaufstabelle] Datenänderungen.
--Fügen Sie für [Zigarettenverkaufstabelle] die ersten Testdaten ein, was normal ist.

IN DIE Zigarettenverkaufstabelle EINFÜGEN (Zigarettenmarke, Käufer, Verkaufsmenge, Verkaufsstückpreis, Verkaufsmenge)
SELECT „Hongtashan New Force“, „ein Käufer“, 10,12,1200
GO

--Fügen Sie für [Zigarettenverkaufstabelle] die zweiten Testdaten ein. Die Daten „Verkaufsmenge“ sind nicht gleich „Verkaufseinheitspreis * Verkaufsmenge“.
--Der Auslöser korrigiert die Daten automatisch, sodass der Verkaufsbetrag dem Verkaufsstückpreis * der Verkaufsmenge entspricht.

IN DIE Zigarettenverkaufstabelle EINFÜGEN (Zigarettenmarke, Käufer, Verkaufsmenge, Verkaufsstückpreis, Verkaufsmenge)
SELECT 'Hongtashanrenrenfeng','ein Käufer',10,22,2000
GO

--Fügen Sie für [Zigarettenverkaufstabelle] den dritten Teil der Testdaten ein. Die Zigarettenmarken in diesen Daten können nicht in der Zigarettenbestandstabelle gefunden werden.
--Der Trigger meldet einen Fehler.

IN DIE Zigarettenverkaufstabelle EINFÜGEN (Zigarettenmarke, Käufer, Verkaufsmenge, Verkaufsstückpreis, Verkaufsmenge)
SELECT 'Honghe V8','ein Käufer',10,60,600
GO

/*
Ergebnismenge
Server: Nachricht 50000, Ebene 16, Status 1, Prozess T_INSERT_Cigarette Sales Table, Zeile 15
Fehler! Die Zigaretten sind nicht vorrätig und können nicht verkauft werden.
*/

--Fügen Sie für [Zigarettenverkaufstabelle] den dritten Teil der Testdaten ein. Die Zigarettenmarke in diesen Daten hat einen Bestand von 0 in der Zigarettenbestandstabelle.
--Der Trigger meldet einen Fehler.

IN DIE Zigarettenverkaufstabelle EINFÜGEN (Zigarettenmarke, Käufer, Verkaufsmenge, Verkaufseinheitspreis, Verkaufsmenge)
SELECT 'Yuxi','ein Käufer',10,30,300
LOS

/*
Ergebnismenge
Server: Nachricht 50000, Ebene 16, Status 1, Prozess T_INSERT_Cigarette Sales Table, Zeile 29
Fehler! Der Zigarettenbestand ist kleiner oder gleich 0 und kann nicht verkauft werden.
*/
--Daten abfragen
SELECT * FROM Cigarette inventory table

SELECT * FROM Cigarette Sales Table
GO

/*
Ergänzung:
1 Dieses Beispiel erklärt hauptsächlich die Verwendung von Triggern durch die Implementierung einer einfachen Geschäftsregel basierend auf Muss flexibel gehandhabt werden
2. In Bezug auf Trigger müssen Sie die beiden in diesem Beispiel erstellten Trigger verstehen und verwenden siehe:
///////////////////////////////////////// ///////// /////////////////////////////////////////////////////////////////////// //////////// ///////////////////////////

                                             

///////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////// ////// /////////////////////////////////////


CREATE TRIGGER trigger_name
ON { table |. view }
[ WITH ENCRYPTION ] – wird für verschlüsselte Trigger verwendet
{
{ { FOR | } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NICHT ZUR REPLIKATION ]
AS
[ { IF UPDATE ( Spalte )
[ { AND | OR } UPDATE ( Spalte ) ]
[ ...n ] < | 🎜>
4 , In Bezug auf Trigger sollten Sie auch beachten, dass
(1) DELETE-Trigger keine TRUNCATE TABLE-Anweisungen erfassen können.
(2). Die folgenden Transact-SQL-Anweisungen sind in Triggern nicht zulässig:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
(3). Trigger können bis zu 32 Ebenen verschachtelt werden.

*/

--Ändern Sie den Auslöser
--Ändern Sie im Wesentlichen CREATE TRIGGER... in ALTER TRIGGER....

--Trigger löschen
DROP TRIGGER xxx
GO

--Testumgebung löschen
DROP TABLE Zigarettenbestandstabelle
GO
DROP TABLE Zigarettenverkäufe Tabelle
GO
DROP TRIGGER T_INSERT_Cigarette inventory table
GO
DROP TRIGGER T_INSERT_Cigarette sales table
GO
############# ##### ######################################## ###
Grundlegend Wissen und Beispiele für Trigger
: Trigger tr_name
auf Tabelle/Ansicht erstellen
{für | nach | statt } [update][,][insert][,] [delete]
[ Verschlüsselung]
as {batch |. if update (col_name) [{and|or} update (col_name)] }

Beschreibung:
1 tr_name: Triggername
2 für Tabelle/Ansicht : Die Tabelle, auf die der Trigger wirkt. Ein Trigger kann nur auf eine Tabelle wirken
3 für und nach: auch
4 nach und statt: sql 2000 neue Elemente die Differenz zwischen afrer und statt
Nach
wenn das Triggerereignis auftritt wird später aktiviert und kann nur auf der Tabelle
anstelle des entsprechenden Triggerereignisses erstellt werden. Es kann entweder auf der Tabelle oder auf der Ansicht erstellt werden : Die drei Vorgänge zum Aktivieren eines Triggers können gleichzeitig ausgeführt werden, oder einer von ihnen kann ausgewählt werden
6 wenn update (col_name): Gibt an, ob der Vorgang Auswirkungen auf die angegebene Spalte hat. Wenn ja, aktivieren der Auslöser. Da sich der Löschvorgang außerdem nur auf Zeilen auswirkt,
können Sie diese Anweisung nicht verwenden, wenn Sie den Löschvorgang verwenden (obwohl bei der Verwendung kein Fehler auftritt, kann der Trigger nicht aktiviert werden, was bedeutungslos ist).
7 Zwei spezielle Tabellen, die beim Ausführen von Triggern verwendet werden: gelöscht, eingefügt.
Gelöscht und eingefügt können als spezielle temporäre Tabelle bezeichnet werden, die vom System automatisch generiert wird, wenn ein Trigger aktiviert wird. Seine Struktur Die verwendete Tabellenstruktur durch Trigger ist derselbe, aber die gespeicherten Daten sind unterschiedlich.

Fortsetzung
Die folgende Tabelle erläutert den Unterschied zwischen gelöschten und eingefügten Daten
Der Unterschied zwischen gelöschten und eingefügten Daten
Eingefügt
Speichert die Daten nach Einfüge- und Aktualisierungsvorgängen
Gelöscht
Speichern Sie die Daten vor Lösch- und Aktualisierungsvorgängen
Hinweis: Der Aktualisierungsvorgang entspricht dem ersten Löschen und dann dem Einfügen. Wenn Sie also den Aktualisierungsvorgang ausführen, werden die Daten vor der Änderung in die gelöschte Tabelle kopiert und die geänderten Daten
Wenn die Daten in der Tabelle gespeichert werden, in der der Trigger angewendet wird, wird auch eine Kopie in der eingefügten Tabelle generiert



/////////


TRIGGER ERSTELLEN [TRIGGER admixture_receive_log] AUF dbo.chl_lydj 
ZUM UPDATE
AS
begin
        declare @djsfxg char(10)      declare @wtbh char(20)
        select @wtbh= wtbh from inserted
       update ly_tzk set djsfxg='已修改' wo wtbh=@wtbh
end
if (select data_sfjl from t_logsetup)='是'
begin
declare @old cjmc char ( 100)          declare @oldlyrq datetime
declare @oldbzbh char (60)             declare @oldzl char (20)
declare @olddj char (10)

 

deklariere @newcjmc char ( 100)          declare @newlyrq datetime
declare @newbzbh char (60)             declare @newzl char (20)
declare @newdj char (10)

 

             declare @xgr char ( 20). =cjmc, @newlyrq=lyrq,@newbzbh=bzbh,@newzl=zl,@newdj=dj from inserted

             select @xgr=xgr from t_modifyuser wo @wtbh=wtbh

             

         if @oldcjmc<>@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 <>0 
       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 <>0 
       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


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage