SQLServer級聯(lián)刪除的實現(xiàn)
SQLServer 2000與Oracle 8i相比,SQLServer級聯(lián)刪除有太多的限制,下面就為您介紹SQLServer級聯(lián)刪除的實現(xiàn)方法,供您參考。
表內(nèi)自關(guān)聯(lián)不支持級聯(lián)刪除和級聯(lián)更新
一個表內(nèi)在有多個列同時關(guān)聯(lián)于另一個表時,不支持多個級聯(lián)刪除
還有什么循環(huán)級聯(lián)刪除限制,等等
.......
一大堆限制,如果要遷移Oracle到SqlServer麻煩多多,特別對于用于構(gòu)造樹型結(jié)構(gòu)的表內(nèi)自關(guān)聯(lián)(比如部門表)的級聯(lián)刪除特別討厭
考慮來考慮去,對于SqlServer不能支持的諸多SQLServer級聯(lián)刪除只有采用最原始的方法,徹底不用外鍵關(guān)聯(lián),而是用觸發(fā)器來解決
以下是經(jīng)過驗證的觸發(fā)器實現(xiàn)范例(自關(guān)聯(lián)例子)
放棄外鍵關(guān)聯(lián)后所有的完整性檢查都要通過觸發(fā)器實現(xiàn)
--DELETE 級聯(lián)刪除,先刪除,再刪除所有級聯(lián)的記錄,采用遞歸觸發(fā)器,當(dāng)然要求數(shù)據(jù)庫支持遞歸觸發(fā)器功能開啟(數(shù)據(jù)庫屬性設(shè)置中開啟他),不過SqlServer只支持32級的遞歸啊
- IF EXISTS (SELECT NAME FROM SYSOBJECTS
- WHERE NAME = 'DEL_DOCUMENTTYPE_001' AND TYPE = 'TR')
- DROP TRIGGER DEL_DOCUMENTTYPE_001
- GO
- CREATE TRIGGER DEL_DOCUMENTTYPE_001
- ON dbo.DOCUMENTTYPE
- FOR DELETE
- AS
- IF (SELECT COUNT(*) FROM DELETED) > 0
- DELETE FROM dbo.DOCUMENTTYPE WHERE UPNO IN (SELECT NO FROM DELETED)
- GO
【編輯推薦】