2016-06-09 204 views
0

我試圖做使用Azure的SQL數據庫的一些批處理刪除,我跑的聲明如下:SQL DELETE語句只刪除最後一行

delete from DbRoles where AccountID = 41; 

人們預計,所有行帳戶ID是41,但它只從表格中刪除最後一個匹配的行。我發現,這是否使用常規的「其中」語句,以及使用子查詢像

where Id in (select Id from DbRoles where AccountID = 41) 

(和Id in (41, 42, 43, ... etc)也失敗了),沒有人有任何想法,爲什麼這可能是是真的嗎?

----- -----編輯

更多信息回答在評論一些問題: 角色表確實有刪除(感謝小費@Steve福特)觸發我們有一個Closure表連接到角色表,當角色表中發生操作時,它通過觸發器進行更新。其中之一是刪除觸發器,肚裏如下:

CREATE TRIGGER [tr_dbRole_delete] 
    ON [dbo].[DbRoles] 
    Instead of DELETE 
    AS 
    BEGIN 

     declare @roleID int; 

     select @roleID = Id from deleted 

     --delete self closure 
     delete from DbRoleClosures 
     where childID = @roleID and parentID = @roleID 

     --delete role 
     delete from DbRoles 
     where Id = @roleID 

    END 

我認爲,「相反」的聲明可能是我的罪魁禍首,任何人都可以驗證?

+0

我的猜測是,你的要求是不正確的和別的東西是怎麼回事。該語句實際上應該刪除與where子句匹配的所有行。 – wvdz

+0

可能是其他行在其他表中有引用數據。 – Sami

+0

桌子上有觸發器嗎? –

回答

1

你的觸發只能刪除,因爲這句話的一行:

select @roleID = Id from deleted 

當你刪除@roleID將被設置爲ID用隨一個賴以爲了SQL服務器查詢已刪除的表多行。

觸發應該是這樣的:

CREATE TRIGGER [tr_dbRole_delete] 
ON [dbo].[DbRoles] 
Instead of DELETE 
AS 
BEGIN 


    --delete self closure 
    delete from DbRoleClosures 
    where childID = parentId AND 
      childID in (SELECT Id from deleted) 

    --delete role 
    delete from DbRoles 
    where Id in (SELECT Id from deleted) 

END 
+0

完美,謝謝@SteveFord,這正是問題所在,現在我開始用這種心態去更新所有觸發器。 – TChadwick