2

我目前正在编写一个使用 SQLite 的应用程序。SQLite 没有ON UPDATE时间戳功能,所以我为它编写了第一个触发器。然后我写了一个触发器来在插入的修改和创建的字段上添加当前时间戳。

当我去删除插入的修改/创建字段的设置时,问题就来了。我觉得我在向将来可能会看到我的代码的开发人员隐瞒一些东西。这可能是混乱的根源。

他们如何知道 sql 来自触发器。我应该评论它吗?这是不好的做法吗?

4

4 回答 4

2

根据经验,触发器旨在实现 SQL 功能规则,例如包含、排除、分区等。这种东西属于模型,应尽可能作为触发器实现。它必须与数据库一起交付,否则模型将被破坏

关于您的情况,这更像是一种黑客攻击。如果你不能做不同的事情,那就去做,然后像你说的那样添加评论。但它应该仍然是一个例外。

请记住,触发器所做的几乎所有事情都可以在应用程序层完成(无论您想要什么)

于 2013-03-06T23:00:42.953 回答
1

“我觉得我对开发人员隐瞒了一些东西......” - 这是一个非常好的观点。我遇到过许多使用@@Identity 的开发人员,他们真的很震惊,如果有人在插入另一行的表上放置一个触发器,他们最终会得到错误的身份。(与 SCOPE_IDENTITY() 相反 - 我知道这些是特定于 sql server 的,但这几乎就是我所知道的......)

它是隐藏的——除了文档之外,我不确定你是否可以让它更明显。

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

于 2013-03-06T23:06:42.523 回答
1

良好的观察力。有些事情只有触发器才能做。但是,我建议如果有任何替代方法可以使用触发器,那么请使用替代方法。我不熟悉 SQLite,但在任何其他数据库中,我会使用 DEFAULT 而不是触发器来为新记录加时间戳。为了捕获更新日期,我会将其包含在存储过程中,或者您拥有的任何数据库端逻辑中(RandomUs1r 建议的那种)。我可能会考虑使用触发器,但仅限于非常基本的操作。

您是正确的,触发器可能会令人困惑且难以调试。

于 2013-03-06T23:00:22.567 回答
0

在修改记录的代码上,要在 SQLLite 中获取当前时间戳...,请尝试:

DATETIME('NOW')
于 2013-03-06T22:57:24.337 回答