我目前正在编写一个使用SQLite的应用程序。 SQLite没有时间戳的ON UPDATE
函数,所以我写了第一个触发器。然后我写了一个触发器,在插入的修改和创建的字段上添加当前时间戳。
当我去删除插入的修改/创建字段的设置时出现了问题。我觉得我隐藏了开发人员可能会在将来看到我的代码的东西。这可能是混乱的根源。
他们如何知道sql来自触发器。我应该评论一下吗?这是不好的做法吗?
答案 0 :(得分:2)
根据经验,触发器旨在实现SQL功能规则,例如包含,排除,分区等。 这种东西属于模型,只要有可能就应该作为触发器实现。它必须随数据库一起提供,否则模型将被破坏。
关于你的情况,它比任何东西都更糟糕。如果您不能做不同的事情,请执行此操作,然后添加您所说的评论。但它应该仍然是一个例外。
请记住,触发器所做的几乎所有操作都可以在应用程序层完成(无论您想要哪个)
答案 1 :(得分:1)
很好的观察。只有触发器可以做一些事情。但是我建议如果有任何替代方法使用触发器,那么使用替代方案。我不熟悉SQLite,但在任何其他数据库中,我会使用DEFAULT而不是触发器来为新记录添加时间戳。为了捕获更新的日期,我将其包含在存储过程或您拥有的任何数据库端逻辑中(RandomUs1r建议的类型)。我可能会考虑触发器,但仅限于非常基本的操作。
你说错了,触发器可能会令人困惑并且难以调试。
答案 2 :(得分:1)
“我觉得我正在隐藏开发人员的东西......” - 这是一个非常好的观点。我遇到过很多使用@@ Identity的开发人员,他们真的感到震惊的是,如果有人在桌子上插入另一行,他们最终会得到错误的身份。 (与SCOPE_IDENTITY()相反 - 我知道这些是特定于sql server的,但这几乎是我所知道的......)
它是隐藏的 - 除了文档,我不确定你是否可以使它更加明显。
这就是为什么许多人尽可能避免使用它们 - 我想如果在某些情况下使用它们没有简单的方法,那么只要它有详细记录等等。我认为像游标一样,虽然被许多人嘲笑,但它们可能非常强大,有用......但是如果他们可以避免可能是最好的。
答案 3 :(得分:0)
在修改记录的代码上,要获取SQLite中的当前时间戳...,请尝试:
DATETIME('NOW')