sqlite 如何仅在用户定义函数存在时才调用它?

krcsximq  于 2022-11-24  发布在  SQLite
关注(0)|答案(3)|浏览(148)

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”错误。
是否只有在定义了函数的情况下才能调用它?任何替代的解决方案都是值得赞赏的。

s8vozzvw

s8vozzvw1#

在调用用户定义的函数之前,可以通过从pragma_function_list中进行选择来检查该函数是否存在;

select exists(select 1 from pragma_function_list where name='ChangeNotify');
1
huwehgph

huwehgph2#

通过将针对pragma_function_list的查询与触发器上的WHEN语句结合起来,可以实现这一点--

CREATE TRIGGER AfterInsert AFTER INSERT ON T
WHEN EXISTS (SELECT 1 FROM pragma_function_list WHERE name = 'ChangeNotify')
BEGIN
  SELECT ChangeNotify('T', 'INSERT', NEW.id);
END;

除了查询准备尝试在执行之前解析函数。所以,afaik,这在触发器中是不可能做到的。
我要如法炮制,在这里问道:https://sqlite.org/forum/forumpost/a997b1a01d希望他们带着解决方案回来。

更新

SQLite论坛建议在加载扩展时使用create temp trigger--https://sqlite.org/forum/forumpost/96160a6536e33f71
这实际上是一个很好的解决方案,因为临时触发器是:

  • 对其他连接不可见
  • 在创建它们的连接结束时被清除
envsm3lx

envsm3lx3#

SQLite被设计为嵌入式数据库,因此假定您的应用程序控制对数据库执行的操作。
SQLite没有用于检查用户定义函数的SQL函数。
如果您只想侦测自己程式中所做的变更,请使用sqlite3_update_hook

相关问题