SQL Server誤區(qū)30日談 第4天 DDL觸發(fā)器就是INSTEAD OF觸發(fā)器
誤區(qū) #4: DDL觸發(fā)器(SQL Server 2005之后被引入)就是INSTEAD OF觸發(fā)器
這是錯(cuò)誤的
DDL觸發(fā)器的實(shí)現(xiàn)原理其實(shí)就是一個(gè)AFTER觸發(fā)器。這個(gè)意思是先發(fā)生DDL操作,然后觸發(fā)器再捕捉操作(當(dāng)然如果你在觸發(fā)器內(nèi)寫了Rollback,則也可能回滾)。
存在Rollback也意味著這個(gè)觸發(fā)器并不像你想象的那么輕量,來(lái)看下面的例子:
ALTER TABLE MyBigTable ADD MyNewNonNullColumn VARCHAR (20) DEFAULT 'Paul'
如果存在一個(gè)defined for ALTER_TABLE事件的DDL觸發(fā)器,或是一個(gè)更寬泛的事件比如DDL_TABLE_EVENTS。上面那個(gè)DDL代碼將會(huì)對(duì)表中每一行數(shù)據(jù)加進(jìn)新列,之后觸發(fā)觸發(fā)器操作。如果你的觸發(fā)器中存在回滾來(lái)阻止DDL操作發(fā)生,那么這個(gè)代價(jià)可不小(不信的話你自己看看這么做后產(chǎn)生的日志)。
當(dāng)然更好的辦法是對(duì)ALTER設(shè)置GRANT或是DENY權(quán)限,或是僅僅允許通過(guò)你創(chuàng)建的存儲(chǔ)過(guò)程進(jìn)行DDL操作。
但不管怎么樣,雖然DDL觸發(fā)器可以達(dá)到禁止DDL的操作的目的,但代價(jià)昂貴。而DDL觸發(fā)器的好處是允許記錄某些人做了某些修改表之類的操作,所以我并不是說(shuō)不允許DDL觸發(fā)器,而是要小心使用。
Kimberly有一篇非常好的關(guān)于DDL觸發(fā)器的博文:"EXECUTE AS" and an important update your DDL Triggers (for auditing or prevention)”。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信