2013-10-07 176 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