2013-06-28 25 views
2

假设我有一个表格,并且我设置了一个after update触发器,它更新了相同更改的行中的列。SQL服务器和触发器反映变化顺序?

是否允许触发器在更新后立即执行,但在某人尝试读取值之前执行?

实施例:

存在用于更新的触发,这台"IsNameSet"1(当name被修改)

update myTable set name="a" where id={...}

然后立刻

select IsNameSet from myTable where id=...{modified row id}

(!)

是否保证我会方式见1

回答

2

如果SELECT发生在UPDATE事务(包括触发器)提交之前,那么它取决于读取事务的隔离级别。

在读取未提交时,它可以读取name="a" and IsNameSet = 0

如果是快照,它可以读取该行的预更新值。否则,它将被阻止读取该行,直到UPDATE事务提交并将读取“after”值。

根据确切的要求,这可能是某个计算列可能比触发器更有效的做法。

+0

所以你说要设置'IsNameSet'列作为一个计算列?但它不取决于隔离级别? –

+0

@RoyiNamir - 正是以效率为理由。触发器需要额外的开销,因为它们需要填充'INSERTED'和'DELETED'表。但是如果你需要参考列的“之前”值,那么计算列将不起作用。 –

+0

你是什么意思,“只是效率的理由”(对不起,不知道它是什么意思)。 “它是否也取决于隔离级别”? –