为自定义 ChangeTable 创建数据库触发器
Posted
技术标签:
【中文标题】为自定义 ChangeTable 创建数据库触发器【英文标题】:Create Database trigger for custom ChangeTable 【发布时间】:2012-05-31 09:58:44 【问题描述】:我正在尝试在 SQL Server 2008 中为 tblCustomer
表创建数据库触发器。每次在tblCustomer
表中插入、更新或删除时,我都需要它在tblChanges
表中添加一个新行。
具体来说,我需要它插入已更改的CustomerId (PK)
、发生更改的dateTime
,以及更改的类型(插入、更新、删除)。
到目前为止,我已经掌握了这些方面的一些内容,但无法弄清楚其余部分:
CREATE TRIGGER change_trigger
AFTER INSERT OR UPDATE OR DELETE
ON tblCustomer
DECLARE log_action varchar(30)
BEGIN
IF INSERTING THEN
log_action := 'I';
ELSEIF UPDATING THEN
log_action := 'U';
ELSEIF DELETEING THEN
log_action := 'D';
ELSE
DBMS_OUTPUT.PUT_LINE('undefined');
END IF;
INSERT INTO tblChanges(ChanedPK, ChangedTime, ChangedType)
VALUES ...
我不确定上述任何 SQL 是否正确,因为我还没有尝试运行它,而且我对 SQL 的了解有限。任何帮助完成代码和纠正错误将不胜感激。
【问题讨论】:
【参考方案1】:尝试以下方法:
CREATE TRIGGER change_trigger AFTER INSERT, UPDATE, DELETE
ON tblCustomer
AS
BEGIN
DECLARE log_action varchar(30)
IF EXISTS (SELECT * FROM INSERTED) AND NOT EXISTS(SELECT * FROM DELETED)
SET log_action = 'INSERT'
IF EXISTS NOT (SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED)
SET log_action = 'DELETE'
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED)
SET log_action = 'UPDATE'
-- Your other code goes here
END
也许您应该首先阅读 SQL Server 中的 T-SQL 和 DML 触发器。 MSDN 和许多其他网站提供了关于如何做事的优秀示例。
【讨论】:
好吧,这工作正常,但我还需要它来插入当前日期和时间以及已更改行的 PK。有什么帮助吗? 好的,我的日期时间很好。它只是GETDATE()。但我仍然无法找到 pk SQL Server 通过两个名为inserted 和deleted 的虚拟表向表公开更改。它们包含所有更改的数据。以上是关于为自定义 ChangeTable 创建数据库触发器的主要内容,如果未能解决你的问题,请参考以下文章