为什么在3.8.8.3数据库中禁用了递归触发器,我没有*指定编译指示?

时间:2015-05-27 08:39:19

标签: sqlite system.data.sqlite pragma recursive-triggers

根据SQLite文档,从版本3.7.0开始,默认情况下应该启用递归触发器。但是,当我使用版本3.8.8.3打开一个数据库的conncetion(特别是使用NuGet的System.Data.SQLite核心)并检查pragma时,它们被设置为'0'或关闭,果然,它们不会火递归。

如果我在使用3.8.2的开源工具Sqlite浏览器之类的东西中打开数据库,那么它也会将pragma设置为off。我可以在UI中启用它们,但是一旦我关闭,然后重新打开数据库,它们就会再次关闭。 WTF?!!

我甚至尝试添加“PRAGMA RECURSIVE_TRIGGERS = 1;”连接字符串,一些在线文档说应该工作,但当然不会。

我还查看了SQLiteConnectionStringBuilder,虽然它确实有其他pragma相关内容(如二进制GUID)的引用,但它引用递归触发器让我相信你能更多不要使用连接字符串。

简单地说,这打破了我们的应用程序。我们依赖于数据完整性的递归触发器。

我们唯一的解决方案是手动编辑应用程序用来添加pragma的每个SQL查询,这是一个真正的婊子!

所以......任何人都可以帮我弄清楚为什么默认情况下没有启用递归触发器?

1 个答案:

答案 0 :(得分:2)

由于向后兼容性,默认情况下不会启用它们。

正如您已经提到的,在3.7.0之前没有递归触发器。一旦它们被引入,如果默认启用它们将会破坏许多生产环境。

相反,选择了谨慎的方法并且它们受支持,但默认情况下未启用。让每个人都采用它,使它成为一个普通的东西,然后它可以默认启用。就像@CL所说 - 它们可能会在未来的SQLite版本中默认启用。