2013-03-06 54 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的特定,但是这几乎是所有我知道...)

它是隐藏的 - 比其他的文件我不知道,你可以使它更可见无论是。

这就是为什么许多人尽可能避免它们 - 我猜如果在某些情况下没有简单的方法使用它们,那么只要它有很好的文档记录等等。我认为游标,虽然被许多人嘲笑,他们可以非常强大和有用的......但如果他们可以避免可能是最好的。