Sql server SQL server和触发器反映的更改顺序?
假设我有一个表,我在update之后设置了一个Sql server SQL server和触发器反映的更改顺序?,sql-server,triggers,Sql Server,Triggers,假设我有一个表,我在update之后设置了一个触发器,它更新了相同的已更改行中的一列 是否承诺在更新后但在有人尝试读取值之前立即执行触发器 例如: 有一个更新触发器,它将“IsNameSet”设置为1(当名称被修改时) updatemytable set name=“a”其中id={…} 然后马上(!) 从myTable中选择IsNameSet,其中id=…{modified row id} 它是否保证我将始终看到1?如果SELECT发生在UPDATE事务(包括触发器)提交之前,则它取决于读取事
触发器,它更新了相同的已更改行中的一列
是否承诺在更新后但在有人尝试读取值之前立即执行触发器
例如:
有一个更新触发器,它将“IsNameSet”
设置为1
(当名称
被修改时)
updatemytable set name=“a”其中id={…}
然后马上(!)
从myTable中选择IsNameSet,其中id=…{modified row id}
它是否保证我将始终看到1
?如果SELECT
发生在UPDATE
事务(包括触发器)提交之前,则它取决于读取事务的隔离级别
在readuncommitted时,它可以读取name=“a”和IsNameSet=0
如果是快照,则可以读取行的更新前值。否则,它将被阻止读取该行,直到UPDATE
事务提交并读取“after”值
根据具体要求,计算列可能比触发器更有效。那么您是说将IsNameSet
列设置为计算列?但这不也取决于隔离级别吗?@RoyiNamir-仅仅是基于效率的考虑。触发器有额外的开销,因为它们需要填充插入的和删除的表。但是如果您需要引用列的“before”值,那么计算列将不起作用。您所说的“仅仅基于效率”是什么意思(对不起,不知道它是什么意思)。这是对“它是否也取决于隔离级别”的回答吗?@RoyiNamir如果计算列被持久化,可能会出现readuncommitted
也会返回不一致的结果的情况。但是如果SELECT
查询想要事务一致的结果,那么它无论如何都不应该使用readuncommitted
。