使用triggerc更新插入的记录

时间:2013-10-07 14:57:47

标签: sql sql-server triggers

我有一个表格,我需要使用已插入记录的标识更新列的值。

以下是我写的触发器:

CREATE TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE dbo.Employee
    SET RecordID = (SELECT EmployeeID FROM INSERTED ) WHERE EmployeeID= (SELECT EmployeeID FROM INSERTED )
END

触发器已成功创建,但当我将记录插入表格时,出现以下错误:

  

最大存储过程,函数,触发器或视图嵌套级别   超过(限制32)。

如果我没有将where条件放在update语句中并按如下方式写入触发器:

ALTER TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE dbo.Employee
    SET RecordID = (SELECT EmployeeID FROM INSERTED )
END

我收到以下错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   一种表达。声明已经终止。

更新记录以将主键保留在另一列中以便我可以在同一个表中添加更多记录并使它们保持相关的最佳做法是什么?

我可以在存储过程中编写Update语句,我使用@@ Identity插入记录,但我想使用触发器执行相同的操作。

2 个答案:

答案 0 :(得分:3)

您应该在INSERTED表上加入表,因为它可以包含更多行。

CREATE TRIGGER [dbo].[UpdateRecordID]
on [dbo].[Employee]
AFTER INSERT
AS 
BEGIN   
    UPDATE e
    SET RecordID = i.EmployeeID 
    FROM dbo.Employee e
    INNER JOIN INSERTED i on i.EmployeeID = e.EmployeeID
END

答案 1 :(得分:0)

  

更新记录以将主键保留在另一列中以便我可以在同一个表中添加更多记录并使它们保持相关的最佳做法是什么?

我认为你想要代表一个等级制度。通常,对于没有父级的行,保存关系的列将为null,而不是将自己的PK复制到其中。

一个例子:

create table Items (
      ID int not null primary key identity(1, 1)
    , Name varchar(50) not null unique
    , ParentID int null references Items (ID)
);
insert into Items (Name, ParentID) select 'Parent', null;
insert into Items (Name, ParentID) select 'Child', ID from Items where Name = 'Parent';

请注意,我们不需要触发器,插入子记录非常容易。

SQL中还有other methods to representing a hierarchy,包括SQL Server自己的HierarchyID

对于您的错误消息,这些消息可能表示您发生了一些触发器递归。检查嵌套和递归触发器的值。