Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL触发器:在更新主键时,如何确定;删除“;记录“响应”的内容;插入“;记录?_Sql_Sql Server 2005_Tsql_Triggers - Fatal编程技术网

SQL触发器:在更新主键时,如何确定;删除“;记录“响应”的内容;插入“;记录?

SQL触发器:在更新主键时,如何确定;删除“;记录“响应”的内容;插入“;记录?,sql,sql-server-2005,tsql,triggers,Sql,Sql Server 2005,Tsql,Triggers,假设我知道更新主键是错误的 还有其他问题意味着插入的和更新的表记录按位置匹配(其中第一个匹配另一个)。这是事实还是巧合 当主键在更新时发生更改时,是否有任何东西可以将两个表连接在一起?插入+删除的虚拟表行位置不匹配 不,您不能匹配行 一些选择: 还有另一个唯一的不变(用于该更新)键来链接行 限制为单行操作 使用带有OUTPUT子句的存储过程来捕获前后键 用OUTPUT子句代替触发器(TBH不确定是否可以这样做) 不允许主键更新(在注释后添加) 是--在要更新的表中创建一个“旧主键”字段,并首先

假设我知道更新主键是错误的

还有其他问题意味着插入的
和更新的
表记录按位置匹配(其中第一个匹配另一个)。这是事实还是巧合


当主键在更新时发生更改时,是否有任何东西可以将两个表连接在一起?

插入+删除的虚拟表行位置不匹配

不,您不能匹配行

一些选择:

  • 还有另一个唯一的不变(用于该更新)键来链接行
  • 限制为单行操作
  • 使用带有OUTPUT子句的存储过程来捕获前后键
  • 用OUTPUT子句代替触发器(TBH不确定是否可以这样做)
  • 不允许主键更新(在注释后添加)
是--在要更新的表中创建一个“旧主键”字段,并首先填充它

即使将插入和删除的psuedo表记录键的数据存储在某个日志表中,也无法对其进行匹配

我想,或者,您可以创建一个单独的日志表来跟踪主键(旧的和新的)的更改。这可能比我刚开始建议的向正在更新的表中添加一个字段更有用,因为它允许您跟踪给定记录的多个更改。我想这取决于你的情况

但也就是说,在你做任何事情之前,请找一块黑板,写100遍:

我知道更新主键不好。
我知道更新主键不好。
我知道更新主键不好。
我知道更新主键不好。
我知道更新主键不好。


:-)(开玩笑)

每个表都允许有一个标识列。标识列不可更新;插入记录时(或添加列时)会为它们指定一个值,并且它们永远不会更改。如果主键是可更新的,则它不能是标识列。因此,要么该表有另一列作为标识列,要么您可以向其中添加一列。没有规定标识列必须是主键。然后在触发器中,inserted和updated中具有相同标识值的行是同一行,您可以支持一次更新多行上的主键。

+1特别是关于行位置的部分。这是一个同样的神话,让人们相信没有排序的
SELECT
总是以同样的方式运行。我想我可以在主键上加入
inserted
updated
,只允许不修改主键的更新。(我使用的是
而不是
触发器。)+1表示不允许主键更新,如果这是您的情况下的一个选项。@Aaron--但“无顺序选择方式”的行为总是相同的:不可预测。我最后使用了一个与前后匹配的标识字段。我认为更新标识字段是相当禁忌的。我想你指的是伪表。至于您的问题,如果您必须一次更新多行上的主键,那么尝试在触发器内连接这些伪表是自找麻烦的。一次只更新一行的主键不会有问题,对吧?我想我无法限制触发器一次处理多少行,所以一次更新一行不会有问题,但是没有办法限制一次更新一个。当更新多行时,触发器肯定可以阻止涉及更改主键的更新。您的应用程序是否设计为一次更改多行上的主键?“更新主键是不好的”(a)有很多事情通常是不好的,但在某些情况下可能是必要的。或者至少,这比其他选择更糟糕。(b) 即使某些事情毫无疑问是糟糕的,一个给定的程序员也可能因为没有做出设计决策而被迫去做。