T-SQL-Insert-Trigger für insert -, update auf if-Bedingung auf mehrere Tabellen
Ich habe da ein paar Probleme zu lösen versuchen eine SQL-Trigger automatisch einem Benutzer gesperrt, & erstellen Sie die block-Datensatz einschließlich Datum in einer anderen Tabelle, wenn Ihre Fälligkeit ist gleich ein Datum festlegen.
Das Problem ist, dass, wenn der trigger deaktiviert ist, die von einer insert -, print-Anweisung und der insert-Auftritt, aber das einfügen in die Tabelle nicht, oder die update-Anweisung ? Kann mir jemand erklären, warum ?
Hinweis: Sowohl die insert-und Update-Anweisung sind in Ordnung, wenn ausgeführt durch sich selbst.
KONTO-TABELLE
CREATE TABLE [dbo].[Account](
[AccountNo] [int] IDENTITY(1,1) NOT NULL,
[CustomerNo] [int] NOT NULL,
[PaymentNo] [int] NULL,
[CreditNo] [int] NULL,
[BlockID] [dbo].[number] NULL,
[Balence] [dbo].[currency] NOT NULL,
[AmountDue] [dbo].[currency] NOT NULL,
[DueDate] [dbo].[dates] NULL,
[AutherisedBy] [nvarchar](50) NOT NULL,
[DateCreated] [date] NOT NULL,
BLOCKEDUSER TABELLE
CREATE TABLE [dbo].[BlockedUsers](
[BlockID] [int] IDENTITY(1,1) NOT NULL,
[DateEnforced] [dbo].[dates] NOT NULL,
[Blocked] [dbo].[switch] NOT NULL,
TRIGGER
ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
Declare @ID int
Select @ID = [AccountNo] from inserted
If(Select [DueDate] from inserted) = '2011-01-01'
INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1)
PRINT 'New Block Date Added'
UPDATE Account
Set BlockID = IDENT_CURRENT('BlockID')
where @ID = @ID
PRINT 'Account Blocked'
END
GO
Voll funktionsfähig Beispiel : durchgeführt mit Hilfe Unten.
ALTER TRIGGER [dbo].[Add_Blocked_User]
ON [dbo].[Account]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
Declare @ID int
Select @ID = [AccountNo] from inserted
If(Select [DueDate] from inserted)Not Between (select CONVERT(date, getdate() - 30)) And (select CONVERT(date, getdate()))
Begin
INSERT INTO dbo.BlockedUsers(DateEnforced,Blocked)
VALUES (GETDATE(),1)
PRINT 'New Block Date Added'
UPDATE Account
Set BlockID = (Select Max(BlockID) From BlockedUsers)
where [AccountNo] = (Select [AccountNo] from inserted)
PRINT 'Account Blocked'
End
END
GO
- Der Auslöser wird unterbrochen, wenn zwei oder mehr Zeilen eingefügt bekommen mit einer einzigen Anweisung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
IF
- Anweisung in Transact-SQL erwartet, dass eine einzelne Anweisung nach der Bedingung:Möchten Sie mehr als eine Anweisung in der gleichen Branche, müssen Sie schließen Sie in die
BEGIN
/END
"Klammern":In Ihr auslösen, nur die INSERT-Anweisung führt in Abhängigkeit vom Ergebnis der
(Select [DueDate] from inserted) = '2011-01-01'
Zustand. Da für beide Gedruckt, und der AKTUALISIERUNG, die Sie ausführen bedingungslos, d.h. nach jeder insert intoAccount
. Ja, werden Sie wahrscheinlich brauchen, um hinzuzufügenBEGIN
undEND
um INSERT -, UPDATE-und beide Drucke:Hast du
Den Sie verwenden möchten
FÜR EINFÜGEN, teilt Sql Server mit, dass der Auslöser vollständig ersetzen wird die normale insert-operation. NACH dem EINFÜGEN erzählt Sql Server, gehen Sie vor und legen Sie die Zeile, und dann diesen code ausführen, werden als post-processing Schritt.
FOR INSERT
undAFTER INSERT
meine die gleichen, die in Transact-SQL. Es istINSTEAD OF INSERT
ersetzt, dass die eigentliche operation.