【问题标题】:Trigger or SP: what should I use in my case?触发器或 SP:在我的情况下我应该使用什么?
【发布时间】:2011-06-27 18:44:51
【问题描述】:

我有一个由我们公司的其他团队编写的应用程序,可以在一个表中插入数据。 假设他们将数据写入带有字段的表 Log1:

  • Id(自动生成的主键);
  • KeyId;
  • 值1;
  • 价值2;
  • 价值 3。

现在我需要在另一个表 (Log2) 中从他们那里获得另一条额外记录,其中只有部分数据:

  • Id(这将是我自己的自动生成的Id);
  • KeyId;
  • 值 1。

我看到了两种方法:

  1. 创建触发器,在将记录添加到 Log1 时将自动在 Log2 中创建包含所需数据的记录;
  2. 实现将接受 Log1 表的所有必需数据并在两个表中创建记录的 SP,然后要求那些应用程序作者使用 SP 而不是直接 INSERT 查询。

您认为在这种情况下最好的方法是什么?为什么?

非常感谢您的帮助。

附:我正在使用 MS SQL 2005

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures triggers


    【解决方案1】:

    选择选项 1。

    这意味着即使没有使用“正确”的存储过程接口,表也将正确同步,并且插入多行将更容易和更有效(您如何使用 SQL Server 中的存储过程来做到这一点2005?- 多次调用?先把所有数据转成XML格式?)

    【讨论】:

      【解决方案2】:

      如果您使用触发器,请注意 Log1 和 Log2 似乎都使用标识列,您不能使用 SELECT @@IDENTITY 返回 Log1 的 PK - 您需要使用 SCOPE_IDENTITY()

      另一方面,如果您使用 SPROC,您可以做的就是撤销(几乎)所有人对您的表的 INSERT 权限,而是授予您的 SPROC 上的 EXEC。这样一来,对您的餐桌的访问应该得到很好的保护。

      【讨论】:

      • 我最喜欢这个主意。问题是在我们的例子中我不会关心权限等......
      【解决方案3】:

      真正保证数据完整性的唯一方法是使用触发器。总有可能有人会执行绕过您的 SP 的操作(批量操作、sql 插入语句等)。

      【讨论】:

      • 我们不会进行批量操作。如果我们需要 - 我们会调用 SP 几次。
      【解决方案4】:

      选择选项 2。

      应尽可能避免使用触发器。

      一个不太明显的原因:您曾经使用过 SQL Server 复制工具吗?触发器不会很容易复制。 (也就是说,它不像点击几下那么简单,就像表格一样)。但我跑题了...底线,触发器是邪恶的...尽可能避免。

      编辑

      更多原因:触发器不像 DBMS 中的其他对象那样容易看到。在应用程序方面,它们是不可见的,如果没有很好的文档记录,它们往往会被遗忘。如果架构发生了变化......哦,好吧,使用存储过程来维护东西会更容易。

      【讨论】:

      • 愿意分享为什么应该避免触发因素?
      • 我没有使用复制,我认为在可观察的未来(2-4 年)我们不需要这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多