插入事件发生时,我可以将列值更新为触发器吗?

时间:2011-06-29 17:26:15

标签: sql sql-server sql-server-2008 triggers

我正在使用SQL Server 2008.我可以在插入触发器发生的同一个表中更新列值吗?

即,我可以使用此代码吗?

CREATE TRIGGER tr_Table1_Insert_Table1name
ON Table1name
FOR INSERT AS

BEGIN

 UPDATE @NEW
    SET COLUMN = 3;

END
GO

如果“不”,怎么能让这种情况发生?

3 个答案:

答案 0 :(得分:2)

如果我理解你的问题,这应该做你想要的:

CREATE TABLE dbo.Test_Insert_Trigger (
    my_id INT NOT NULL,
    my_string VARCHAR(20) NULL,
    CONSTRAINT PK_Test_Insert_Trigger PRIMARY KEY CLUSTERED (my_id)
)
GO
CREATE TRIGGER dbo.tri_Test_Insert_Trigger
ON Test_Insert_Trigger FOR INSERT
AS
BEGIN
    UPDATE T
    SET my_string = CAST(I.my_id AS VARCHAR(20))
    FROM
        INSERTED I
    INNER JOIN dbo.Test_Insert_Trigger T ON
        T.my_id = I.my_id
END
GO
INSERT INTO dbo.Test_Insert_Trigger (my_id) VALUES (1)
SELECT * FROM dbo.Test_Insert_Trigger

正如OMG小马指出的那样,在许多情况下,DEFAULT约束是你真正想要的。

答案 1 :(得分:1)

是的,你可以。您的代码没有问题,因为UPDATE语句不会干扰您覆盖的INSERT。你会想要这样的东西:

UPDATE Table
SET Column = 3
WHERE Table.ID IN (SELECT ID FROM inserted)
  AND Table.ID NOT IN (SELECT ID FROM deleted);

这假设您的表格有ID列。

答案 2 :(得分:0)

在更新行插入触发器后必须使用。

CREATE TRIGGER tr_Table1_Insert_Table1name ON Table1name 
    AFTER INSERT 
AS  BEGIN   
    UPDATE Table1
    SET COLUMN = 3
    Where ...  
END 
GO