2013-05-11 88 views
0

我正在嘗試爲包含分配給特定ID的某些鍵的表創建一個觸發器。SQL到期日期觸發器

這就是我要怎樣做:

CREATE TRIGGER expirationDateCheck 
BEFORE UPDATE ON sp 
FOR EACH ROW 
BEGIN 
IF DATE_ADD(OLD.date,INTERVAL 10 DAY) > CURDATE() THEN 
SET OLD.sid=0,OLD.cid=0 
END IF 
END 

基本上每次都會有一些即將投入的SP表我想先通過表格,找到任何行,其中當前日期晚比分配給該行的日期晚十天,並將他們的sid和cid設置爲0.

我該怎麼做?

+0

爲什麼你覺得有必要在觸發器中做到這一點?這些類型的維護活動通常由按計劃運行的存儲過程執行。 – 2013-05-12 02:06:19

+0

也是 - 這是一個突變......所以將很難解決(但不是無法取決於RDBMS) – Randy 2013-05-12 03:25:05

+1

您使用的是什麼RDBMS?像觸發器這樣的事情是**高度**供應商特定的 - 並且* SQL *只是結構化的查詢語言 - 但不是數據庫產品... – 2013-05-12 07:41:44

回答

0

在觸發操作中,FOR EACH ROW表示'受觸發操作影響的每一行',而不是'表中存在的每一行'。因此,如果您在語法上修正了這種情況,則只會在更新行時對其進行操作。

在語法上,你可能尋找的動作中UPDATE語句:

UPDATE sp SET sid = 0, cid = 0 WHERE DATE_ADD(date, INTERVAL 10 DAY) > CURDATE() 

給予或採取新的或舊預選賽。在SQL(如標準SQL)的一些版本中,你需要一個REFERENCING子句:

ON sp REFERENCING OLD AS OLD, NEW AS NEW 

好,這是我在Informix中,這使得它使用符號;您可能需要指定OLD和NEW以外的其他別名,否則您的DBMS可能會隱式地使用OLD和NEW的引用符號。由於您沒有提及DBMS,因此很難做出明確的決定。

0

你不想在觸發器中做到這一點。你可能認爲你想要,但這不是觸發器的目的。有很多理由不要濫用它們,尤其是如果你這樣做,他們會咬你。

你可能不想更新行!而不是說,讓我更新超過10天的行,創建一個視圖,將這些列返回爲10天以上的行(或消除這樣的行等)。這爲您節省了定期維護和不必要的I/O,保留了實際的真實數據,並且討論了表格上次更新時間爲10天的問題。