2012-12-15 5 views
7

Mam kilka problemów, próbując rozwiązać wyzwalacz SQL, aby automatycznie ustawić użytkownika, aby zablokował & utworzyć rekord bloku zawierający datę w innej tabeli, jeśli ich Termin płatności jest równy ustawionej dacie.T-SQL Wstaw wyzwalacz do wstawienia, aktualizuj jeśli warunek na wielu tabelach

Problem jest, że gdy spust jest wyłączony przez wkładkę, instrukcje drukowania są wykonywane i wkładka występuje, ale wkładka w tabeli nie ma, lub oświadczenie zmiana? Czy ktoś może wyjaśnić, dlaczego?

Uwaga: Zarówno wkładka oraz instrukcję aktualizacji są w porządku, gdy wykonywane przez siebie.

KONTA TABELA

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 TABELA

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 

pełni Przykład pracy: Zakończony korzystania Pomoc Poniżej.

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 
+4

Twój spust pęknie, gdy dwa lub więcej wierszy dodaje się za pomocą jednego rachunku. –

Odpowiedz

5

Oświadczenie w Transact-SQL IF oczekuje pojedynczej instrukcji po warunek:

IF condition 
    statement; 

Jeśli chcesz wykonać więcej niż jedno oświadczenie w tej samej gałęzi, należy ująć je w BEGIN/END " wsporniki ":

IF condition 
BEGIN 
    statement; 
    statement; 
    ... 
END; 

W swojej spuście tylko INSERT który zaciągnął w zależności od wyniku stanu (Select [DueDate] from inserted) = '2011-01-01'. Ponieważ zarówno dla wydruków i aktualizacji oni wykonać bezwarunkowo, to znaczy po każdy wstawić do Account. Tak, prawdopodobnie trzeba dodać BEGIN i END wokół INSERT, UPDATE i obu odbitek:

... 
If(Select [DueDate] from inserted) = '2011-01-01' 
BEGIN 
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; 
... 
+0

Dziękuję Andy, To pomogło mi uzyskać poprawne działanie mojego warunku, który został rozszerzony o systematyczne blokowanie tylko w przypadku, gdy data jest> 30 dniowa. Kudos, naprawdę doceniane. – Baggerz

-1

Zrobiłeś

FOR INSERT 

Chcesz użyć

AFTER INSERT, UPDATE 

FOR INSERT informuje SQL Server, że wyzwalacz będzie całkowicie zastąpić normalne funkcjonowanie insert. PO WSTAWIE mówi serwerowi Sql, aby kontynuował i wstaw wiersz, a następnie wykonaj ten kod jako etap przetwarzania końcowego.

+8

'FOR INSERT' i' AFTER INSERT' oznaczają to samo w języku Transact-SQL. To 'INSTEAD OF INSERT' zastępuje rzeczywistą operację. –

+0

Dziękuję Andy, To pomogło mi uzyskać aktualizację i wstawić działa poprawnie. Naprawdę doceniony. – Baggerz

+1

Niestety o tym :(Nigdy nie używać FOR. To był fakt, że konto aktualizacja nie wszystko, co mnie zastanowiło go jako działającego w charakterze zamiast robić. –

Powiązane problemy