为自定义 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 创建数据库触发器的主要内容,如果未能解决你的问题,请参考以下文章

为啥单击功能会在 Angular 2 中为自定义组件触发两次

为自定义对象 oneAPI 创建数据缓冲区时遇到问题

IAR 为自定义数据定义内存区域

为自定义文件类型创建主题 - Sublime

为自定义 Laravel 包提供数据的最佳方式是啥?

为自定义响应标头创建 wsdl