2009-09-30 73 views
-1

任何人都可以向我解釋觸發器的下面的代碼嗎?請注意,上面的代碼是由我的一個類隊友編寫的,我無法理解其中的任何內容。無法理解觸發語句

我無法理解它。

此外,如果有任何其他方式來完成相同的任務,請讓我知道。

CREATE trigger [dbo].[trg_InsertInBookIssuedDetails] 
on [dbo].[BOOKISSUEDDETAILS] 
for insert 
as 
begin 

    begin tran 

    update nur 
    set nur.NumberOfBooksIssued = nur.NumberOfBooksIssued+1 
    FROM NEWMEMBER nur 
    INNER JOIN INSERTED i 
    ON i.IssuedTo = nur.MEMBERName 

    if exists(
    select 1 
    from LIBRARYBOOKDETAILS lbd 
    INNER JOIN INSERTED i 
    ON i.BookID = lbd.BookID 
    WHERE lbd.Inventory<=1 
) 
    begin 
    raiserror('Books UnAvailable Or Cannot Issue More Than 3 Books',16,-1) 
    rollback tran 
    end 

    else 
    begin 
    update lbd 
    set lbd.Inventory = lbd.Inventory - 1 
    FROM LIBRARYBOOKDETAILS lbd 
    INNER JOIN INSERTED i 
    ON lbd.BookID= i.BookID 

    commit tran 
    end 

end 

請幫我理解上面的觸發語句。

在此先感謝!

+0

您是否試圖瞭解觸發器通常會執行什麼操作,或者該觸發器中的SQL是做什麼的? – David 2009-09-30 16:47:33

+0

雙間隔SQL是你的問題。 – Welbog 2009-09-30 16:47:56

+0

這個觸發器中的SQL是幹什麼的? – Sheetal 2009-09-30 16:50:03

回答

0

這裏是一個快速擊穿

在數據庫中存在一個名爲[BOOKISSUEDDETAILS]由[DBO]

該表擁有的表具有觸發器上叫[trg_InsertInBookIssuedDetails]歸[DBO]。只要將一行插入表中,該觸發器就會觸發。

它啓動一個事務(簡單地說,事務是執行多行作爲一個單位的能力 - 全或無)

當行插入它意味着一個書發出後,所以這觸發更新NEWMEMBER表中的一行。

如果在LIBRARYBOOKDETAILS中不存在本書的條目,那麼該事務將回滾,這意味着NEWMEMBER表保持不變。

如果這本書存在,那麼它通過1在圖書館的書細節

它看起來像你只粘貼部分代碼遞減庫存盤點。在這個opint中應該有一個END和一個COMMIT語句。儘管如此,我必須說SQL很容易閱讀和理解 - 如果這是家庭作業,並且你必須經常做這種類型的東西,那麼應該通過T-SQL引擎來達到速度。

0

這是在有人向BookIssuedDetails表中插入一行時激活的觸發器。它沒有提及'for each row'或任何類似的東西,所以我認爲它在一些行插入後執行一次(可能只包括1行)。討論INSERT INTO BookIssuedDetails SELECT * FROM Somewhere WHERE 1 = 0會發生什麼是很有趣的,因爲沒有行由語句插入/

它更新NewMember表來記錄發出的書籍;在「」插入關鍵字是一個別名大約相當於「插入BookIssuedDetails表中的結果」

它還對LibraryBookDetails進行一些檢查,生成一個誤導性的錯誤消息(在IT中是傳統的) - 它不檢查發給這個圖書館成員的書的數量如果LibraryBookDetails指出有書可用,它會更新表減少噸他可用的特定書籍的編號。

所有受過教育的猜測。

0

開始的時候是很有問題的。

inserted表被插入(進入BOOKISSUEDETAILS)所有行的僞表

它啓動一個事務,因爲它會做兩兩件事:增加的成員發行的圖書數量(我認爲這當INSERTED包含多行,因爲它會多次更新 - 不確定這是否可靠),並減少書的庫存。它首先檢查在書架上是否有一本書有兩本或兩本以上的副本(我認爲這是一個錯誤),因爲如果庫存中的書籍數量少於1本,則會產生錯誤。

在任何情況下,對於圖書館系統來說都不是一個現實的實現方式,因爲每本書都是獨一無二的,即使您有多本書的副本,您的廣告資源總是1或0,您需要知道每個人一。

0

觸發器用於維護數據完整性。是的,同樣的事情可以在存儲過程中完成,甚至可以通過(不寒而慄)的動態sql來完成。但是,通過將代碼放入觸發器中,無論數據如何進入數據庫,都要確保遵循規則。因爲在這種情況下,您影響可用於檢出的圖書庫存是觸發器的最佳選擇。

在我看來,它的觸發是增加的另一個表在這種情況下發出來的人到正在運行的總書的數量。

然後檢查,看看是否書籍是庫存,如果他們不回滾整個事務。 (我個人會先做檢查)。如果他們在庫存中,則將庫存減少一個,因爲該書已被檢出。

一件事,你會看到的是,在觸發引用一個名爲inserted表,你不要在你的數據庫結構看。這個(和一個名爲DELETED的simliar表)是一個僅在觸發器中可用的數據表。它包含剛插入的數據。

對於插入的每個批次(或根據觸發器更新或刪除),觸發器觸發一次。這意味着如果插入1個rrecord,插入的表將會有一條記錄,如果在批處理中插入10,000條記錄,那麼插入的表將包含10,000條記錄。在設計觸發器時牢記這一點很重要。

您的設計似乎有點不妥。你不應該使用成員名稱加入,因爲人們沒有唯一的名字。你不希望第一個約翰史密斯的記錄與第二個約翰史密斯的記錄混雜在一起。名稱應始終具有用於確保唯一性的代理ID。