2011-06-01 247 views
1

我很難理解這段代碼在做什麼。有人可以幫助我逐行理解這段代碼,以便我能夠理解它在做什麼。SQL語句。需要幫助瞭解它

CREATE TRIGGER LowCredit ON Order 
AFTER INSERT 
AS 

DECLARE @creditrating tinyint 

SELECT @creditrating = v.CreditRating 
FROM Customer c INNER JOIN inserted i 
ON c.custID = i.custID 

IF @creditrating = 5 
BEGIN 

    RAISERROR ('This customers''s credit rating 
    is too low to accept new orders.’) 

    ROLLBACK TRANSACTION 

END 

回答

2

它正在檢查信用評級是否爲某個值,如果信用評級太低會引發錯誤並回滾交易。

--Declare a trigger with name `LowCredit` on table `Order`, 
--run the trigger after 
CREATE TRIGGER LowCredit ON Order 
insert. 
AFTER INSERT 

AS 
--start definition 
--declare int 
DECLARE @creditrating tinyint 

--select from existing customer record the 
-- inserted rows credit ranking (by custID) 
-- inserted is the vt containing the changed rows 
SELECT @creditrating = v.CreditRating 
    FROM Customer c INNER JOIN inserted i 
ON c.custID = i.custID 
--if lower than 5 roll back 
IF @creditrating = 5 
BEGIN 
--raise error to the session 
RAISERROR ('This customers''s credit rating 
is too low to accept new orders.’) 
--roll back transaction 
ROLLBACK TRANSACTION 

END 
+0

-1根據我的問題在我的答案。即使你是正確的,代碼也是錯誤的。 – gbn 2011-06-02 07:27:22

+0

他並沒有要求我找到一個錯誤,他要求解釋代碼。 – Nix 2011-06-02 12:09:23

1

在觸發將阻止該行的插入在Order如果客戶的信用等級太低迴滾...

inserted是包含插排(S)的虛擬表。

+1

對於一個隨機的客戶,如果插入很多訂單... – gbn 2011-06-01 11:56:08

0

INSERTED是一個包含新的(或改變UPDATE)排在Order

此副本是用來窺視Customer表中找到信用評級一個特殊的表。

如果信用等級過低,則會引發錯誤

的一些問題:

  • 它不會處理多行(例如,許多訂單一氣呵成)。實際的信用評級被檢查將是一個隨機排出來的但是許多插入
  • 沒有try/catch塊,以提供更好的錯誤處理,並停止觸發因素是批次中止
  • 失蹤SET NOCOUNT ON將使大部分的客戶在某些時候

注:

  • 觸發器是INSERT語句範圍的部分,關聯交易
0

如果評級小於5,那麼它將檢查正在創建訂單的客戶的「CreditRating」,並且出現錯誤並且交易將回滾。我希望編碼器已經使用BEGIN TRANSACTION別的其他明智ROLLBACK TRANSACTION地方沒有開始將報錯

1

的錯誤是第7行與i.c.更換v.

+0

+1用於發現錯誤 – harag 2011-06-01 13:16:59