2013-06-28 108 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

你是什麼意思,「只是效率的理由」(對不起,不知道它是什麼意思)。 「它是否也取決於隔離級別」? –