SQL触发器不起作用更新同一个表

时间:2014-02-13 08:11:06

标签: sql sql-server

我为插入

后创建了一个触发器
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]列

[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
插入ClientNumber后没有更新

关心, 穆罕默德

2 个答案:

答案 0 :(得分:0)

它取决于当前在数据库上设置的触发器的递归级别。

如果你这样做:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

或者这个:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

上面的那个触发器不会被再次调用,你会安全的(除非你遇到某种僵局;这可能是可能的,但也许我错了)。

不过,我认为这是一个好主意。更好的选择是使用INSTEAD OF trigger。这样您就可以避免通过DB执行第一次(手动)更新。只会执行触发器内定义的那个。

答案 1 :(得分:0)

SQL Server(和Oracle)不喜欢您对该表的触发器中的变异表进行更改。您需要以不同的方式处理它,或拦截插入。

由于您尝试更改插入的数据,因此可以使用Instead of而不是after插入触发器:

这是一个非常简单的表示方式:

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