根据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查询,这是一个真正的婊子!
所以......任何人都可以帮我弄清楚为什么默认情况下没有启用递归触发器?
答案 0 :(得分:2)
由于向后兼容性,默认情况下不会启用它们。
正如您已经提到的,在3.7.0之前没有递归触发器。一旦它们被引入,如果默认启用它们将会破坏许多生产环境。
相反,选择了谨慎的方法并且它们受支持,但默认情况下未启用。让每个人都采用它,使它成为一个普通的东西,然后它可以默认启用。就像@CL所说 - 它们可能会在未来的SQLite版本中默认启用。