我必须在 sql server 2000 环境中对我们的一个数据库进行数据库清理。清理基本上包括禁用所有触发器、删除所有旧数据、启用触发器和缩小事务日志。
目前我遇到的最大问题是禁用触发器。这在 sql 2005 / 2008 中非常容易,因为它们包含一个“全部禁用触发器”命令。我有一个查询来列出所有触发器,尽管它没有列出触发器的状态(这将是一个奖励)
SELECT S2.[name] TableName, S1.[name] TriggerName, CASE WHEN S2.deltrig = s1.id THEN 'Delete' WHEN S2.instrig = s1.id THEN 'Insert' WHEN S2.updtrig = s1.id THEN 'Update' END 'TriggerType' , 'S1',s1.*,'S2',s2.* FROM sysobjects S1 JOIN sysobjects S2 ON S1.parent_obj = S2.[id] WHERE S1.xtype='TR'
删除记录将是每个表的简单删除,这可能不是最有效的方法,但它是规定的方法。
Shrinking the Transaction Log 也是排序的,我在 Microsoft 支持网站上找到了一篇关于使用 DBCC 的文章
任何建议将不胜感激
SQL Server 2000 也有ALTER TABLE foo ENABLE TRIGGER ALL
并生成所需的 ALTER TABLE 脚本使用这个
我个人不会打扰测试触发器的状态。恕我直言,禁用的触发器不应该存在。尤其是因为OBJECTPROPERTY在 SQL Server 2000 中不支持它
编辑:
我的错误,SQL Server 2000 中的 OBJECTPROPERTY 根据评论具有 ExecIsTriggerDisabled。这样您就可以跟踪之前和之后的状态