sql - 仅在存在时更改 TRIGGER

标签 sql sql-server triggers

我正在我的数据库上实现审计系统。它在每个表上使用触发器来记录更改。 我需要对这些触发器进行修改,因此正在为每个触发器生成 ALTER 脚本。 我想做的是只更改这些触发器(如果它们存在),理想情况下是这样的:

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'TR' AND name = 'MyTable_Audit_Update')
BEGIN
ALTER TRIGGER [dbo].[MyTable_Audit_Update] ON [dbo].[MyTable]
 AFTER Update
...
END

但是,当我这样做时,我收到一条错误消息“关键字 TRIGGER 附近的语法无效”

这些触发器可能不存在的原因是可以在最终用户可以指定的表上启用/禁用审计。这涉及创建或删除触发器。我无法在创建触发器时对其进行更改,因为它们是动态创建的,因此我仍然必须提供一种方法来更改触发器(如果它们存在的话)。

最佳答案

alter 语句必须是批处理中的第一个。所以对于 sql server 它将是:

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'TR' AND name = 'MyTable_Audit_Update')
BEGIN
EXEC('ALTER TRIGGER [dbo].[MyTable_Audit_Update] ON [dbo].[MyTable]
 AFTER Update
...')
END

关于sql - 仅在存在时更改 TRIGGER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25156428/

相关文章:

sql - 等于操作中 “Latin1_General_CI_AS”和 “SQL_Latin1_General_CP1_CI_AS”之间的冲突

使用自连接捕获数据的 SQL 查询

sql - SQL Server 中仅对年份进行日期时间查询

postgresql - 触发函数参数 PLSH

mysql - 将 IN 运算符与子查询结合使用

sql - 有效查询连续天数记录

SQL:如何使用仅代表一周中某些天的数据显示一周中的完整 7 天?

SQL 查询 - 根据条件对连续项目进行分组

mysql - 加速或自动创建历史表触发器

mysql - 是否可以创建触发器以将值复制到另一行(在同一个表中)的同一字段中?