【问题标题】:notification that table rows have been changed通知表行已更改
【发布时间】:2011-04-09 12:27:53
【问题描述】:

当表格的行发生改变时,这些改变的行被写入XML,并让我知道表格已经改变了。

我该怎么做?

【问题讨论】:

  • 问题是我无法更改存储的 proc 。也许我可以添加一个触发器。但我怎么会知道这些变化。有什么好办法吗?

标签: sql-server sql-server-2000


【解决方案1】:

如果您正在寻找严格的 TSQL 或 SQL Server 解决方案:

  • 编写一个存储过程来处理UPDATEDELETEINSERT功能。
  • 拒绝用户UPDATEDELETEINSERT
  • 允许对这个新存储过程的用户执行 EXEC
  • 在每次调用存储过程时,在另一个表中创建一个条目,专门为审计而构建。
  • 编写一个 SQL 作业来轮询此审计表以获取新记录。使用 SQL Mail 发送电子邮件。你不清楚你想要什么样的通知,但我认为是电子邮件。

第二个不太吸引人的解决方案:您还可以使用表上的触发器来捕获UPDATEDELETEINSERT 活动。强烈考虑存储过程解决方案而不是触发器。

【讨论】:

  • +1:如果用于维护而不是新开发,触发器会更加灵活。
  • @OMG:我总是在触发器上来回切换。甚至因为建议将它们作为 SO 的第二选择而遭到反对。这个场景尖叫着触发了“太多事情要做”。审计很有趣,但它可以采用任何一种方式,也取决于环境。 50-50。
  • 是的,有时候东西很“时髦”。如果它是新开发人员,我会尽可能避免使用触发器,并且希望每个人都通过存储过程。我开始接受更多的触发器,但总体上仍然讨厌 ORM。
  • 所以你说你不喜欢触发器方法,因为它通常用于在 ORM 场景中向数据库层添加规则,而存储过程表明较厚的数据库层不太可能被基于 ORM 的应用程序的构建者视为愚蠢的数据存储?
【解决方案2】:

如果您无法更改表中数据的更改方式,最好的解决方案是设置触发器以捕获单独表中的更改,然后编写一些代码来定期轮询该表,并构建您的 xml文件。

值得注意的是,在编辑此表中的数据时,这可能会降低您的数据库性能(有利于用户进行更改时的审计,不利于以编程方式更改的数据),并且来自触发器的任何错误都会导致相当误导的消息被抛出 sql server。

请参阅this question 了解有关设置触发器的一些提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2011-03-08
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多