2011-02-15 68 views
4

我有一个由我们公司的其他团队编写的应用程序,将数据插入一张表中。 假设他们将数据写入表Log1的字段中:触发器或SP:我应该在我的情况下使用什么?

  • Id(自动生成的主键);
  • KeyId;
  • Value1;
  • Value2;
  • Value3。

现在我必须说只有他们的数据部分来自他们另一个表(LOG 2)另一个附加记录:

  • ID(这将是我自己的自动生成的ID);
  • KeyId;
  • Value1。

我看到2种方式来做到这一点:

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

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

非常感谢您的帮助。

P.S.我使用MS SQL 2005

回答

1

如果使用触发器,要知道,因为它似乎都LOG1和LOG2使用标识列,你不能使用SELECT @@IDENTITY返回log1中的PK - 你将需要使用SCOPE_IDENTITY()

在另一方面,如果使用存储过程,你可以做的是(几乎)每个人都撤销INSERT权限到表,而是授予EXEC在你的存储过程。通过这种方式访问​​您的表格应该相当有把握。

0

去与选项2

触发器应尽可能避免。

一个不是很明显的原因:你有没有使用SQL Server复制设施?触发器不会很直接地复制。 (即它不像点击几次那样简单,就像例如表格一样)。但我要走的话题...底线,触发器是邪恶 ...当你可以避免。

编辑

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

+0

小心分享为什么应该避免触发器? – 2011-02-15 17:24:44

+0

我没有与复制一起工作,也不认为我们需要在可观察的未来(2 - 4年)内做到这一点。 – Budda 2011-02-15 18:07:56

2

围棋与选项1

这意味着即使不使用“正确”的存储过程接口的表将被适当地同步,它会更容易,更有效地插入多行(如何会你用SQL Server 2005中的存储过程来做到这一点? - 多次调用它?首先将所有数据转换为XML格式?)

1

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

+0

我们不会有批量操作。如果我们需要 - 我们会打几次SP。 – Budda 2011-02-15 18:06:46

相关问题