Sim*_*rdo 5 t-sql sql-server sql-server-2008 database-trigger
使用MSSQL2008.
我有两张桌子.
TableResource
-------------
ID [bigint]
Attribute1 [int]
Attribute2 [int]
Attribute3 [int]
VersionId [uniqueidentifier]
Run Code Online (Sandbox Code Playgroud)
和
TableResourceHistory
--------------------
ID [bigint]
Attribute3History [int]
HistoryDate [datetime]
VersionId [uniqueidentifier]
Run Code Online (Sandbox Code Playgroud)
我有一个instead of update需要完成两件事的触发器:
TableReResource.Attribute3"已更改,则使用"旧"Attribute3值将历史记录写入历史表,并且还修改表的" TableResource.VersionId"字段TableResource.TableReResource.Attribute3" 没有变化,那么只需通过UPDATE.这是我到目前为止所做的,但是我无法想出相等比较来触发历史记录日志.
CREATE TRIGGER [dbo].[tr_UpdateResourceHistoryVersionId] ON [dbo].[TableResources]
INSTEAD OF UPDATE
AS
SET NOCOUNT ON;
BEGIN
-- ?? IF inserted.Attribute3 = deleted.Attribute3
-- ?? THEN we just pass the UPDATE through
UPDATE [TableResources]
SET
VersionId = inserted.VersionId,
Attribute1 = inserted.Attribute1,
Attribute2 = inserted.Attribute2
FROM Inserted, TableResources
WHERE Inserted.ID = TableResources.ID
-- ??? ELSE, the Attribute3 field was updated, and we perform the history log
-- ??? and give it a new version number
-- History Log
INSERT TableResourceHistory (Attribute3History, HistoryDate, VersionId)
SELECT NEWID(), GETUTCDATE(), deleted.VersionId
FROM deleted
-- pass through the update, but assign a new VersionId
UPDATE [TableResources]
SET
VersionId = NEWID(),
Attribute1 = inserted.Attribute1,
Attribute2 = inserted.Attribute2
FROM Inserted, TableResources
WHERE Inserted.ID = TableResources.ID
END
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?TIA!
仅当 .history 表发生更改时才会发生历史表插入Attribute3。
尝试这个
CREATE TRIGGER [dbo].[tr_UpdateResourceHistoryVersionId]
ON [dbo].[TableResources]
INSTEAD OF UPDATE
AS
SET NOCOUNT ON;
BEGIN
IF EXISTS(SELECT 1
FROM inserted i
JOIN deleted d
ON i.ID = d.ID
AND i.Attribute3 = d.Attribute3)
BEGIN
UPDATE T
SET VersionId = inserted.VersionId,
Attribute1 = inserted.Attribute1,
Attribute2 = inserted.Attribute2
FROM Inserted I
JOIN [TableResources] T
ON I.ID = T.ID
JOIN deleted d
ON i.ID = d.ID
AND i.Attribute3 = d.Attribute3
END
IF EXISTS(SELECT 1
FROM inserted i
JOIN deleted d
ON i.ID = d.ID
AND i.Attribute3 <> d.Attribute3)
BEGIN
INSERT TableResourceHistory
(Attribute3History,HistoryDate,VersionId)
SELECT Newid(),
Getutcdate(),
d.VersionId
FROM deleted d
JOIN Inserted i
ON i.ID = d.ID
AND i.Attribute3 <> d.Attribute3
-- pass through the update, but assign a new VersionId
UPDATE T
SET VersionId = Newid(),
Attribute1 = inserted.Attribute1,
Attribute2 = inserted.Attribute2
FROM Inserted I
JOIN [TableResources] T
ON I.ID = T.ID
JOIN deleted d
ON i.ID = d.ID
AND i.Attribute3 <> d.Attribute3
END
END
Run Code Online (Sandbox Code Playgroud)
如果出现问题或未按预期工作,请返回此答案下方的评论部分
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |