在 SQL Server 2008 R2 中为每个表创建创建触发器
Posted
技术标签:
【中文标题】在 SQL Server 2008 R2 中为每个表创建创建触发器【英文标题】:Create trigger upon each table creation in SQL Server 2008 R2 【发布时间】:2017-04-03 19:39:32 【问题描述】:我需要创建一个Audit
表来跟踪我的表在数据库中的操作(插入、更新、删除),并添加带有日期、行 ID、表名和更多详细信息的新行,所以我会知道发生了什么动作以及什么时候发生的。
所以基本上根据我的理解,我需要一个用于跟踪插入/更新/删除的表的触发器和一个用于跟踪新表创建的数据库的触发器。
我的主要问题是了解如何在这些事物之间建立联系,以便在创建新表时为该表创建触发器,该触发器将跟踪操作并根据需要为 Audit 表添加新行。
是否可以为create_table
创建一个 DDL 触发器,并在其中创建另一个用于插入/更新/删除的触发器?
【问题讨论】:
创建表的时候为什么不创建触发器。如果你想自动化,那么你可能必须在你的数据库上实现DDL
触发器
这是我正在考虑的,但我正试图弄清楚如何去做。我不确定我是否理解正确,但我正在尝试为 create_table 创建一个 DDL 触发器,并在其中编写另一个触发器,该触发器正在为插入/更新/删除的特定表名创建触发器。
【参考方案1】:
你所希望的是不可能的。我强烈建议您最好考虑一下您真正希望通过审计在业务层面实现什么。它将产生一个更简单、更实用的解决方案。
首先
...在要跟踪新表创建的数据库上触发。
我怎么强调这个想法是多么可怕。究竟谁可以不受限制地访问您的数据库,以至于他们可以创建表而无需经过代码审查和 QA?这当然应该是在门控路径通向生产。一旦您意识到架构更改不应该发生 ad-hoc,很明显您不需要触发器(它们本质上是 reactive em>) 做某事,因为架构发生了变化。
即使您可以编写这样的触发器:它处于元编程级别,根本不值得尝试预见所有可能的排列。
更好的选择包括:
需求评估和验收:这是系统中的新信息。审核要求是什么? 设计审查:新表;需要审核吗? 测试设计:如何测试审计要求? 代码审查:您添加了一个新表。需要审核吗? 更不用说工具提供的功能,例如: 源代码管理。 Db 部署实用程序(无论是自行开发的还是第三方的)。第二部分
...将为该表创建一个触发器,该触发器将跟踪操作并根据需要为 Audit 表添加新行。
我已经指出了为什么自动执行上述操作是一个可怕。现在我要进一步指出,根本这样做也是一个坏主意。
这是一种流行的方法,我肯定会从那些对它的特殊风格进行了很好的划分的人那里得到一些批评;发誓它“节省”了他们多少时间。 (甚至可能有人声称它是“业务需求”;我可以向您保证,这更有可能是真实需求的错误版本。)
这种方法存在根本问题:
它是被动的,而不是主动的。所以它通常缺乏上下文。 您将难以审核回滚的尝试更改。 (这对于调试来说可能是一场噩梦,并且通常违反实际业务审计要求。) 解释审计将是一场噩梦,因为它只是原始数据。 信息丢失在细节中。 随着列的添加/重命名/删除,您的审计数据会失去凝聚力。 (不过,这通常是最少的问题。) 这些额外的表总是作为其他更新的一部分进行更新,可能会对性能造成严重破坏。 通常这种审计方式包括:每次将一列添加到“基本”表时,它也会添加到“审计”表中。 (这最终使“审计”表非常像一个架构不佳的持久事务日志。) 采用这种方法的大多数人都忽略了“基”表中可空列的重要性。我可以从第一手经验告诉您,除了最简单的情况外,解释此类审计跟踪并不容易。浪费的时间是荒谬的:调查问题,培训其他人能够正确解释它们,编写实用程序以尝试减少使用这些审计跟踪的痛苦,煞费苦心地记录发现(因为信息在原始数据中不会立即显现) .
如果你有任何自我保护意识,你会听从我的建议。
让它变得更好
(对不起,忍不住了。)
更好的方法是主动计划需要审核的内容。推动特定的业务需求。请注意,不同的情况可能需要不同的审计技术:
如果用户执行操作 X,请记录有关该操作的 A 详细信息,以便合法追溯。 如果用户尝试执行 Y 但被系统规则阻止,请记录 B 详细信息以跟踪规则系统完整性。 如果用户登录失败,请记录 C 详细信息以确保安全。 如果系统升级,请记录 D 详细信息以进行故障排除。 如果发生某些系统事件,请记录 E 详细信息...重要的是,一旦您了解真正的业务需求,您就不会说:“嗯,让我们跟踪所有内容吧。它可能有用。 "相反,你会:
能够为每种不同类型的审计生成更简洁、更合适、更可靠的设计。 能够测试它的行为是否符合要求! 能够在需要时更轻松地使用审计数据。【讨论】:
以上是关于在 SQL Server 2008 R2 中为每个表创建创建触发器的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 R2 中为特定数据库用户设置最大查询数
获取每个月的第一个日期 SQL Server 2008 R2
SQL Server 2008 R2,查询在 65536 行后退出