2012-12-15 39 views
7

Tôi đang gặp một số sự cố khi cố gắng giải quyết Trình kích hoạt SQL để tự động đặt người dùng bị chặn & tạo bản ghi khối bao gồm ngày trong bảng khác, nếu Ngày đến hạn của họ bằng với ngày đã đặt.T-SQL Chèn Trình kích hoạt để chèn, cập nhật nếu điều kiện trên nhiều bảng

Vấn đề là khi trình kích hoạt được đặt bằng chèn, các câu lệnh in được thực thi và chèn sẽ xảy ra, nhưng chèn vào bảng không, hoặc câu lệnh cập nhật? Bất cứ ai có thể giải thích lý do tại sao?

Lưu ý: Cả lệnh chèn và câu lệnh Cập nhật đều ổn khi được thực thi bởi chính chúng.

TÀI KHOẢN TABLE

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 TABLE

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 

Hoàn toàn làm việc Ví dụ: Hoàn sử dụng Trợ giúp Dưới đây.

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

kích hoạt của bạn sẽ phá vỡ khi hai hoặc nhiều hàng được chèn với một tuyên bố duy nhất. –

Trả lời

5

Các IF tuyên bố trong Transact-SQL hy vọng một câu lệnh sau điều kiện:

IF condition 
    statement; 

Nếu bạn muốn thực hiện nhiều hơn một tuyên bố trong cùng một nhánh, bạn phải đặt chúng trong BEGIN/END " ngoặc đơn ":

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

Trong trình kích hoạt của bạn, chỉ câu lệnh INSERT thực thi tùy thuộc vào kết quả của điều kiện (Select [DueDate] from inserted) = '2011-01-01'. Đối với cả hai PRINT và UPDATE, chúng thực thi vô điều kiện, tức là sau mỗi chèn vào Account. Vì vậy, bạn có thể cần phải thêm BEGINEND xung quanh INSERT, UPDATE và cả bản in:

... 
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

Thankyou Andy, Điều này đã giúp tôi có được điều kiện của tôi nếu làm việc một cách chính xác mà bây giờ tôi đã mở rộng để sử dụng hệ thống sates để chặn chỉ nếu ngày đáo hạn là> 30 ngày tuổi. Kudo, Thực sự đánh giá cao. – Baggerz

-1

Bạn đã

FOR INSERT 

Bạn muốn sử dụng

AFTER INSERT, UPDATE 

CHO INSERT nói với Sql Server kích hoạt của bạn hoàn toàn sẽ thay thế các hoạt động chèn bình thường. SAU KHI INSERT cho Sql Server để đi trước và chèn hàng, và sau đó thực hiện mã này như là một bước sau chế biến.

+8

'CHO INSERT' và' SAU CH INSN 'có nghĩa là giống nhau trong Transact-SQL. Đó là 'INSTEAD OF INSERT' để thay thế hoạt động thực tế. –

+0

Thankyou Andy, Điều này đã giúp tôi nhận được cả cập nhật và chèn hoạt động chính xác. Rất cảm kích. – Baggerz

+1

Xin lỗi về điều đó: (Tôi không bao giờ sử dụng FOR. Đó là một thực tế là tài khoản cập nhật không làm bất cứ điều gì khiến tôi nghĩ rằng đó là hành động thay vì. –

Các vấn đề liên quan