我正在使用SQL Server 2008.我可以在插入触发器发生的同一个表中更新列值吗?
即,我可以使用此代码吗?
CREATE TRIGGER tr_Table1_Insert_Table1name
ON Table1name
FOR INSERT AS
BEGIN
UPDATE @NEW
SET COLUMN = 3;
END
GO
如果“不”,怎么能让这种情况发生?
答案 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