2017-06-28 44 views
0

我目前正在使用數據庫類,並且需要在數據庫中包含一些觸發器。 我的團隊正在製作庫數據庫,並且需要在屬性DaysOut的值爲「90」​​時進行觸發。稱爲費用的另一個屬性將增加到「10」。這是一個可能的觸發器嗎? 我寫了一些語法,並將其發送給我的教授,但給了我很少的建議。下面是語法:創建觸發器以更新特定值的表

CREATE TRIGGER Late_Fee 
AFTER UPDATE OF DaysOut ON BOOKS 
WHEN DaysOut = 90 UPDATE CUSTOMERS 
SET Fees = Fees + 10 
WHERE Cust_ID = Cust_ID; 

任何幫助,將不勝感激!

+0

您正在使用什麼數據庫管理系統?我討厭大學數據庫課程如何脫離ANSI-SQL標準而不考慮實際的DBMS,因爲在這種情況下沒有實際的答案。這個問題的真正答案應該依賴於正在使用的DBMS,儘管有很多可能支持觸發器創建的類似語法。 –

+0

我們確實還沒有建立實際的DBMS。本書在不同章節引用了Oracle,然後引用了SQL-99。我假設它是Oracle,但這是我的第一個數據庫課程,我不完全確定。儘管謝謝你的迴應! –

+0

這很可能是ANSI-SQL 99.本書可能提到Oracle,因爲它歷來是一種流行的DBMS。然而,根據我的經驗,這些類型的書很少展示來自實際DBMS系統的例子(同樣,這也是我徹底討厭我在大學裏學習的數據庫課程的原因)。 –

回答

0

正如我在我的評論中所述,有用的答案取決於使用的DBMS。由於這似乎是針對大學課程的,因此您可能沒有使用DBMS,答案可能基於ANSI-SQL標準,而不是實際的SQL實現。這就是爲什麼我討厭大多數大學數據庫課程的原因,因爲教授通常會寫出近20年前寫的書,而不是實際經驗(我經常發現很多教此類課程的教授沒有任何實際的真實數據庫經驗)。我會問你的教授,答案是什麼DBMS的目的。如果教授不知道,說脫離您書中的例子,或者說要使用ANSI-SQL標準,那麼這是一個假設性問題,我認爲沒有一個技術上合適的答案(因爲即使有是一個正確的答案,你必須改變它以適應你正在使用的DBMS)。以下是在真實DBMS系統中如何實現這種觸發器的幾個例子。

我的SQL

DELIMITER $$ 

CREATE 
TRIGGER tr_Late_Fee AFTER UPDATE 
ON BOOKS 
FOR EACH ROW BEGIN 

    IF NEW.DaysOut = 90 THEN 
     UPDATE CUSTOMERS 
     SET Fees = Fees + 10 
     WHERE Cust_ID = NEW.Cust_ID; 
    END IF; 

END$$ 

DELIMITER ; 

資源:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

https://www.sitepoint.com/how-to-create-mysql-triggers/

+0

MySQL的版本看起來很像書中的例子,我要給我的教授發電子郵件,看看這是否可以接受。非常感謝! –

+0

如果'inserted'中有多行? – hatchet

+0

@hatchet你對這種情況是正確的,我爲SQL-Server快速編寫的示例代碼並不能處理這種特定情況。在這種情況下,提供的代碼將無法正常運行(您實際上會得到一個SQL異常)。處理這種情況的一種方法是創建一個遊標,我相信這遠遠超出了OP的要求。有很多關於如何在SQL Server中編寫觸發器的示例。目前我沒有太多時間來完善和優化,所以如果它困擾人們,我可能會排除SQL Server示例。 –

相關問題