INSERTED表可以包含来自触发相同触发器的两个同时事务的值吗? SQL Server 2012
我在不同的主机上有相同的应用程序批量插入到同一个表中。每个批量插入件触发一个触发器。该表的结构如下:INSERTED表可以包含来自触发相同触发器的两个同时事务的值吗? SQL Server 2012
Hostname Quantity
---------------------
BOX_1 10
BOX_1 15
BOX_1 20
BOX_1 11
如果我有以下代码作为触发器的一部分:
DECLARE @hostname VARCHAR(20)
SELECT @hostname = Hostname
FROM INSERTED
每个批量插入包含自应用程序只有一个主机名仅捕获数据它的盒子在运行,但如果两台机器同时批量插入同一张表中,INSERTED
表可能是来自不同机器的批量插入的组合?
或将触发器顺序执行,这意味着INSERTED
表将始终从只有一个应用程序在同一时间包含数据?
我需要知道,如果我的代码设置@hostname
变量具有不任何可能被限制到只有一个选择。
的INSERTED
(和DELETED
)表只会包含从引起触发器触发语句行。
在这里看到:https://msdn.microsoft.com/en-us/library/ms191300(v=sql.110).aspx
受影响的行插入表中存储拷贝INSERT 和UPDATE语句中。在插入或更新事务期间,新插入的表和触发器表中都会添加新的 行。该 行inserted表是在触发 表中的新行的副本。
这些表中的行实际上被限定为导致触发器初始触发的插入/更新/删除语句。
也是在这里看到更多的一些信息:SQL Server Trigger Isolation/Scope Documentation
但是记住在你的扳机设计一些其他的插入或更新操作(手动批量插入,或数据进行维护)可能会导致触发器触发,和关于主机名的假设可能不再成立。在你已经移动或忘记了这个触发器之后,这可能会持续数年。
明白了。所以触发器将总是按顺序处理。 – eek142
不,你不会从试图插入两个独立的过程得到了扳机的一个调用。 – pmbAustin
这是一个糟糕的设计。由于插入的表可以包含多个记录,因此不应将标量变量用作来自插入的值。这可能是您现在或将来可能遇到的任何问题的原因。您确实需要解决此问题,因为在SQL服务器触发器中使用这种技术是不可接受的技术。 – HLGEM
通常情况下,HLGEM是正确的,但在这种情况下,只能有一个值,所以它或多或少都可以。虽然分配应该做一个SELECT TOP 1或SELECT DISTINCT或东西表明代码“知道”只会有一个值(也可能是更有效) – pmbAustin