2013-10-07 113 views
0

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

以下是我写的触发器:

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 

触发创建成功,但是当我插入记录表我得到以下错误:

Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

如果我不” t将更新语句中的where条件写入更新语句并写入触发器,如下所示:

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

我得到以下错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.

什么是更新记录,以保持主键在另一列,这样我可以在同一个表中添加更多的记录,并保持他们相关的最佳实践?

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

+0

我有点困惑,为什么你需要在同一个表中两次相同的ID? – twoleggedhorse

+0

我需要这样才能在同一张表中插入另一条记录,并根据该相同ID在两条记录之间建立关系。 – Chatur

+1

拥有关系表不是更好吗?然后,您可以在记录之间建立多条链接,并且可以强制执行约束条件。 – twoleggedhorse

回答

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

这将行得通,但我建议OP希望做一些没有必要的事情 - 毕竟,为什么要在两个独立的列中保留相同的ID?当然,这只是增加了服务器的开销,并保留了冗余数据。我建议可能需要检查数据库的设计,而不是依赖触发器。 – twoleggedhorse

+0

感谢您的回答,但这给了我在问题中提到的第一个错误。 我想保留两列的ID,因为我需要插入记录,这些记录可能与同一张表内的记录有关。 – Chatur

+0

@twoleggedhorse我完全同意。我想OP有一些其他的方式和逻辑,以后更新'RecordID'为特定的行,这只是设置一些初始值。这只是上述触发器的修复。 –

0

What is the best practice to Update a record to keep the Primary Key in another column so that I can add more records in the same table and keep them related?

我认为你在寻找代表一个层次。通常情况下,对于没有父项的行,保存关系的列将为空,而不是将其自己的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

至于你的错误消息,这些可能表明你有一些触发递归发生。检查你的值嵌套和递归触发器。

+0

是的你是对的,但我想避免在右边或在选择声明,我需要获得所有记录,包括父记录: SELECT * FROM dbo.Employee WHERE RecordID = 160或者EmployeeID = 160 – Chatur

+0

@Chatur我建议你不要为了减少打字而损害你的模式。 –

+0

对,我知道了,唯一的解决办法是将RecordID保留在父记录空值... 谢谢 – Chatur