2014-02-13 25 views
0

我創建了一個觸發插入SQL觸發器不工作的更新同桌

ALTER TRIGGER [dbo].[UpdateClientNumber] 
ON [dbo].[APP_Clients] 
AFTER INSERT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @Count bigint 

DECLARE @ClientNumber nchar(15) 

SELECT @Count = COUNT(*) FROM [dbo].[APP_Clients] 

IF @Count = 0 
BEGIN 

    SET @ClientNumber = CONVERT(nchar(4), YEAR(GETDATE())) + '01' + '0001' 

    UPDATE [dbo].[APP_Clients] 
    SET [ClientNumber] = @ClientNumber 
    FROM inserted i 
    LEFT JOIN [dbo].[APP_Clients] j ON i.ID = j.ID 

END 
ELSE 
BEGIN 

    SELECT @ClientNumber = MAX(SUBSTRING([ClientNumber], 7, len([ClientNumber]) - 0)) 
    FROM [dbo].[APP_Clients] 
    WHERE (SUBSTRING([ClientNumber], 1, len([ClientNumber]) - 6) = YEAR(GETDATE())) 

    SET @ClientNumber = CONVERT(bigint, @ClientNumber) + 1 

    SET @ClientNumber = CONVERT(nchar(4), YEAR(GETDATE())) + '01' + @ClientNumber 

    UPDATE [dbo].[APP_Clients] 
    SET [ClientNumber] = @ClientNumber 
    FROM inserted i 
    LEFT JOIN [dbo].[APP_Clients] j ON i.ID = j.ID 

END 
END 

爲表[DBO]之後。[APP_Clients]的柱子插入ClientNumber後

[ID] [bigint] IDENTITY(1,1) NOT NULL, 
[ClientName] [nvarchar](100) NULL, 
[ClientNumber] [nchar](15) NULL, 
[ClientGSM1] [nvarchar](50) NULL, 
[ClientGSM2] [nvarchar](50) NULL, 
[ClientEmail] [nchar](50) NULL, 
[ClientOccupation] [nvarchar](50) NULL, 
[ClientWorkPlace] [nvarchar](100) NULL 

不更新。

與問候,穆罕默德

+0

好,觸發器被破壞的一種方式是假定它只能用於單行。這通常不是一個安全的假設。 –

+0

謝謝,所以我需要執行這個SQL是要完成存儲過程? – Mohammed

回答

0

這主要取決於當前的數據庫觸發器設置遞歸級別。

如果你這樣做:

SP_CONFIGURE 'nested_triggers',0 
GO 
RECONFIGURE 
GO 

或者這樣:

ALTER DATABASE db_name 
SET RECURSIVE_TRIGGERS OFF 

上述觸發將不會再次調用,你會是安全的(除非你陷入某種僵局;這可能是可能的,但也許我錯了)。

不過,我不要認爲這是一個好主意。更好的選擇是使用INSTEAD OF trigger。這樣你可以避免對數據庫執行第一個(手動)更新。只有在觸發器內定義的那個纔會被執行。

0

SQL Server(和Oracle)不喜歡您在該表的觸發器內對變更表進行更改。您需要以不同的方式處理它,或者攔截插入。

既然你想改變插入的數據,你可以使用一個Instead of而不是after INSERT觸發器:

這裏是你會怎麼做一個非常簡單的表示:

Create Trigger trg_App_Clients_Insert 
On App_Clients 
Instead of Insert 
As 
Begin 
    Declare @no int; 

    Select @no = IsNull(Max(ClientNumber), 0) + 1 
    From App_Clients 

    Insert into App_Clients (Name, ClientNumber) 
    Select Name, @no 
    From inserted 
End 
Go