sql-server - 删除表上的 SQL Server DDL 触发器

标签 sql-server tsql triggers ddl-trigger

我有一个包含几个表的数据库:tab1、tab2、tab3。如何在删除表上创建 DDL 触发器 仅适用于 tab2 (不适用于 tab1 和 tab3)。当drop tab2被称为我需要更新此表中的值但不删除 tab2。我怎样才能做到这一点?我发现了这个,但不明白它是如何工作的:

create trigger trDatabse_OnDropTable
on database
for drop_table
as
begin
 set nocount on;
 select
  'Table dropped: ' +
  quotename(eventdata().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')) + N'.' +
  quotename(eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'));
end;

谢谢!

最佳答案

您可以使用 ddl 触发器防止删除表。就像是:

CREATE TRIGGER drop_safe 
ON DATABASE 
FOR DROP_TABLE 
AS 
   PRINT 'You must disable Trigger "drop_safe" to drop table!' 
   ROLLBACK
;

为了仅防止对您指定的表进行删除,您必须仅在这种特殊情况下查看 eventdata() 和 ROLLBACK。

关于sql-server - 删除表上的 SQL Server DDL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22312351/

相关文章:

MySql触发器删除同一张表中的子记录

sql-server - 为什么ssis传输对象阶段返回smo失败

sql - sql - 设置顺序值而不循环/游标

sql - 第 1 行第 4 列(年份)的批量加载数据转换错误(类型不匹配或指定代码页的字符无效)

sql - 如何在字符串中动态确定的位置选择动态数量的子字符串?

mysql - 插入触发器操作时创建触发器语法错误

mysql - PL SQL 触发器在更新单列时更新行的开始时间

sql - 如何将 @VAR + 魔数(Magic Number)传递给 sql 脚本中的存储过程参数?

sql - 计数非常慢,有 700 万行

c# - 将 MS Access 数据库导入 SQL Server 时性能缓慢