触发器或SP:在我的情况下我应该使用什么?

时间:2011-02-15 17:20:02

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

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

将数据写入表Log1
  • Id(自动生成的主键);
  • KEYID;
  • 值1;
  • 值2;
  • 值3。

现在我需要在另一个只有部分数据的表(Log2)中添加另一条记录:

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

我认为有两种方法可以做到:

  1. 创建触发器,将记录添加到Log1中将自动在Log2中创建包含所需数据的记录;
  2. 实现将接受Log1表所有必需数据的SP,并在两个表中创建记录,然后要求那些应用程序作者使用SP而不是直接INSERT查询。
  3. 您认为这种情况下的最佳方式是什么?为什么?

    非常感谢你的帮助。

    P.S。我正在使用MS SQL 2005

4 个答案:

答案 0 :(得分:2)

选择选项1.

这意味着即使没有使用“正确的”存储过程接口,表也会正确同步,并且插入多行会更容易,更有效(如何使用SQL Server中的存储过程执行此操作) 2005? - 多次调用?首先将所有数据转换为XML格式?)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您使用触发器,请注意,因为Log1和Log2似乎都使用标识列,您无法使用SELECT @@IDENTITY返回Log1的PK - 您需要使用{{1} }。

另一方面,如果您使用SPROC,您可以做的是从(几乎)所有人撤消对您的表的INSERT权限,而是在您的SPROC上授予EXEC。这样就可以很好地保护对桌子的访问。

答案 3 :(得分:0)

使用选项2。

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

一个不那么明显的原因:你曾经使用过SQL Server复制工具吗?触发器复制起来不会非常简单。 (即它不像点击几下那么容易,就像表格一样)。但是我要离开主题...底线,触发器是邪恶 ......当你可以时避免。

修改

更多原因:与DBMS中的其他对象一样,触发器并不容易。在应用程序方面,它们是不可见的,如果没有详细记录,它们往往会被遗忘。如果模式有变化......哦,使用存储过程维护内容会更容易。