SQLite允许从SQL语句调用define custom functions。我用它来获得我的应用程序中触发器活动的通知:
CREATE TRIGGER AfterInsert AFTER INSERT ON T
BEGIN
-- main trigger code involves some extra db modifications
-- ...
-- invoke application callback
SELECT ChangeNotify('T', 'INSERT', NEW.id);
END;
但是,用户定义的函数只添加到当前数据库连接中。可能还有其他客户端没有定义ChangeNotify
,我不希望他们得到“no such function”错误。
是否只有在定义了函数的情况下才能调用它?任何替代的解决方案都是值得赞赏的。
3条答案
按热度按时间s8vozzvw1#
在调用用户定义的函数之前,可以通过从pragma_function_list中进行选择来检查该函数是否存在;
huwehgph2#
通过将针对
pragma_function_list
的查询与触发器上的WHEN
语句结合起来,可以实现这一点--除了查询准备尝试在执行之前解析函数。所以,afaik,这在触发器中是不可能做到的。
我要如法炮制,在这里问道:https://sqlite.org/forum/forumpost/a997b1a01d希望他们带着解决方案回来。
更新
SQLite论坛建议在加载扩展时使用
create temp trigger
--https://sqlite.org/forum/forumpost/96160a6536e33f71这实际上是一个很好的解决方案,因为临时触发器是:
envsm3lx3#
SQLite被设计为嵌入式数据库,因此假定您的应用程序控制对数据库执行的操作。
SQLite没有用于检查用户定义函数的SQL函数。
如果您只想侦测自己程式中所做的变更,请使用sqlite3_update_hook。