2014-04-30 98 views
0
ALTER Trigger tr_sal On salaries 
Instead of delete 
AS 
    declare @id int 
    set @id=(select id_teacher from deleted) 
    if @id in (select ID_teacher from techers) 
    BEGIN 
    print 'not able !!' 
    END 
    ELSE 
    BEGIN 
    delete from salaries where [email protected] 
    END 

    delete from salaries 
    where id_teacher=???--(write id) 

我想做的事:觸發「而不是刪除」,它可以工作嗎?

如果ID是老師,你不能刪除他/她的薪水,否則你可以刪除。

我運行此,讓兩個:

  1. 無法刪除無補貼!
  2. (1行(S)的影響)

是我的觸發工作或沒有?

回答

0

你有兩個獨立的DELETE語句。第一個可能不會執行,但第二個(任何BEGIN/END對之外的)是,這就是刪除行。

卸下第二delete from salaries完全地與where在下一行沿。

0

您的觸發器設計不佳。在任何情況下,從不假定只有一條記錄在被刪除(或受損)的僞指標中。你不應該將id的值設置爲標量變量。如果20條記錄被刪除,則只有一條記錄會受到觸發器其餘代碼的影響。觸發器是基於SQL Server設置的,它們不會逐行運行。這是你需要解決的第一件事。不要將打印語句放在觸發器中,它們是無用的。您還需要了解如果某些記錄應該被刪除而其他人不應該如何使用觸發器。

我們知道您的觸發器是否工作正常,需要進行單元測試。

寫一個刪除statment從表中刪除。確保它刪除多條記錄,並且從選擇的記錄中知道您確切要刪除哪些記錄以及哪些不記錄。 運行它 檢查是否發生了觸發器發生的操作,以及記錄是否被刪除。

你應該知道如何做到這一點,而不必去上網弄清楚,如果你自己的代碼工作。

你的邏輯是有點古怪,平時你不想刪除父記錄,如果子記錄存在周圍沒有其他的方式(這是一個FK做什麼)。您需要先刪除子記錄才能刪除父項(除非您使用級聯刪除這是一種可怕的做法,即使您可能會遇到此問題,您應該測試觸發器以查看刪除教師時會發生的情況) ,因此如果按照您的意圖進行操作,您的觸發器可能會在維護數據時造成問題。

相關問題