为了消除触发器的潜在问题,可以使用哪些替代方法来获得对INSERT操作触发的事件作出反应的相同功能?
我有一个数据库,需要在插入时添加一些额外的值。 INSERT由编译代码控制,无法更改。
示例:程序插入一个字符串,我需要在一个指向查找表的新字段中提供一个整数。
如果有触发器的替代品,那么请让我知道任何替代方案的优缺点。主要原因是我们的数据库标准中不允许使用触发器。
SQL Server 2008 Enterprise
答案 0 :(得分:6)
可以使用存储过程,触发器或更复杂的插入语句来完成普通旧插入的替代方法。由于您无法控制insert语句,因此您也无法使用存储过程。所以你唯一的选择是触发器。
您所描述的正是触发器存在的原因。如果您需要完成此任务,则无法在您列出的限制条件下完成此任务。
触发器是最佳选择。更改数据库标准(或者至少允许此任务成为例外)因为它们存在缺陷。
答案 1 :(得分:3)
如何根据要插入的字符串确定整数?
您可能希望了解的另一个选择是computed columns in SQL Server。如果匹配是非常简单的(例如从字符串中提取字符10到14)或类似的东西,你可以创建一个计算列来自动完成 - 不需要触发器。
您甚至可以将这些计算列保持不变(物理存储为表的一部分)并在这些字段上创建索引!
计算列可从SQL Server 2000上获得,来自SQL Server 2005的持久列。
答案 2 :(得分:2)
我知道很久以前就被问过了。使用SQL Server 2008"更改数据捕获"引入了MSDN。另一个替代方案,但仅在2008 R2之后有效,是"更改跟踪" Setting up change tracking。虽然您可以查询行以过滤(look here)已更改的内容,但这可能会也可能不会解决"触发器的问题。
答案 3 :(得分:1)
触发器是 在SQL表上发生事件(插入,更新,删除)后执行操作的方式;它们存在的事实使得不太可能存在任何可行的替代方案。不幸的是,但是你所说的数据库标准有效地阻止了你做你想做的事情而没有运行一些定期监视你的表然后执行你需要的操作,或者改变所有数据库CrUD操作的进程。完成你想要的存储过程。既然你说后者是不可能的 - 你不能改变INSERT
语句 - 那么你只剩下触发器。
答案 4 :(得分:1)
SQL Server 2005现在有一个称为OUTPUT子句的东西,可以在INSERT(或其他操作)发生后执行其他处理。这个article涵盖了更多细节。例如,如果您需要在INSERT命令之后进行处理,则可以执行类似......
的操作INSERT INTO Contact
(FirstName, MiddleName, LastName)
OUTPUT INSERTED.ContactID, INSERTED.FirstName, INSERTED.MiddleName, INSERTED.LastName
INTO Contact_Audit
VALUES
(@@SCOPE_IDENTITY, 'Joe', 'D.', 'Schmoe')
并且您可以为他们提供唯一创建的ID。
答案 5 :(得分:-1)
您可以创建一个存储过程来为您处理所有事情吗?
BEGIN
-- DO YOUR INSERT CODE
IF @@ERROR = 0
-- DO THE OTHER STUFF?
或者您可以在您的应用程序中执行此操作。尝试插入,如果有效,则执行其他步骤。
答案 6 :(得分:-2)
您的选择仅限于此。我认为你唯一的另一种选择是通过存储过程调用进行插入,并将额外的代码放在存储过程中。
答案 7 :(得分:-2)
我认为我们现在可以使用hibernate事件系统实现触发器,尽管它会影响性能。我之前没有这样做。但我认为它有效