2013-03-06 104 views
2

我目前正在編寫使用SQLite的應用程序。 SQLite沒有用於時間戳的ON UPDATE函數,所以我爲它寫了第一個觸發器。然後,我編寫了一個觸發器,將當前時間戳添加到插入的修改和創建的字段上。觸發器是否僅用於SQL無法實現的功能?

問題來了,當我去,並刪除插入修改/創建字段的設置。我覺得我隱瞞了將來可能會看到我的代碼的開發人員。這可能是混淆的來源。

他們將如何知道sql來自觸發器。我應該評論它嗎?這是不好的做法嗎?

回答

0

在修改該記錄的代碼,以獲得當前時間戳......在SQLLite,嘗試:

DATETIME('NOW') 
+1

我不認爲這回答了這個問題。 – 2013-03-06 22:59:18

+0

什麼,那觸發器對他正在嘗試做的事情是一種破壞,其他人提到了這一點?我已經提供了他需要將其放入實際修改記錄並需要更新時間戳記的語句中。 – RandomUs1r 2013-03-06 23:05:59

1

善於觀察。有些事情只有觸發器才能做到。不過,我建議,如果有任何替代使用觸發器,然後使用替代方案。我不熟悉SQLite,但在任何其他數據庫中,我會使用DEFAULT而不是觸發器來記錄新記錄。爲了捕獲更新的日期,我將把它放在一個存儲過程中,或者你擁有的任何數據庫端邏輯(類似於RandomUs1r的建議)。我可能會考慮觸發器,但僅限於非常基本的操作。

你是正確的,觸發器可能會令人困惑,難以調試。

2

作爲一個經驗法則,觸發器是爲了實現SQL功能規則,如包含,排除,分區等。 這種事情屬於模型,應該在觸發器可能的時候實現。它必須與數據庫一起交付,否則模型將被打破

至於你的情況,它比任何東西都更駭人。如果你不能做不同的事情,那麼做,然後添加一個像你說的評論。但它應該是一個例外。

請記住,幾乎所有的觸發器做可以在應用層來完成(無論你想)

1

「我覺得我是瞞着開發商東西......」 - 這是一個非常好的點。我遇到了許多使用@@ Identity的開發人員,他們真的很震驚,如果有人在插入另一行的桌子上放置觸發器,他們最終會得到錯誤的身份。 (而不是SCOPE_IDENTITY() - 我知道這是SQL Server的特定,但是這幾乎是所有我知道...)

它是隱藏的 - 比其他的文件我不知道,你可以使它更可見無論是。

這就是爲什麼許多人儘可能避免它們 - 我猜如果在某些情況下沒有簡單的方法使用它們,那麼只要它有很好的文檔記錄等等。我認爲遊標,雖然被許多人嘲笑,他們可以非常強大和有用的......但如果他們可以避免可能是最好的。