AUD*_*IUV 4 sql sqlite triggers full-text-search
我尝试按照官方文档在外部内容表中使用 SQLite 的全文搜索 (FTS) 扩展。我正在运行 Arch linux 软件包中的 sqlite 版本 3.42.0 sqlite,当前版本为 3.42.0-1。
架构如下:
-- Create main data table
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
-- Create fts index table
CREATE VIRTUAL TABLE users_fts USING fts5 (
content='users',
content_rowid='id',
name
);
-- Create insert trigger
CREATE TRIGGER users_fts_insert AFTER INSERT ON users
BEGIN
INSERT INTO users_fts (rowid, name) VALUES (new.rowid, new.name);
END;
-- Insert some sample data
INSERT INTO users (rowid, name) VALUES
(NULL, 'John Smith'),
(NULL, 'John Doe'),
(NULL, 'Jane Doe');
Run Code Online (Sandbox Code Playgroud)
在 中运行上述内容时sqlite3,该INSERT步骤失败并显示错误消息:
Parse error near line 21: unsafe use of virtual table "users_fts"
如果我注释掉触发器块,它会成功创建两个表并将值插入主表中。奇怪的是,FTS 表似乎也是用匹配的行创建的,并且这些行似乎在各个INSERT/ UPDATE/之间保持同步DELETE,尽管实际的 FTS 功能MATCH不工作(例如SELECT * FROM users_fts WHERE users_fts MATCH 'John'不返回任何行)。
由于我不想手动保持两个表同步,所以我真的更希望有一个基于上述触发器的自动解决方案。问题是我如何设置触发器,还是我如何配置 FTS 表?或者也许 SQLite FTS 中有一些隐藏的限制阻止了这种触发器?
任何帮助将不胜感激!
TRUSTED_SCHEMA这是pragma设置为 false的副作用。
该编译指示是在 Sqlite 3.31 中添加的,并被记录为默认为 true,但 3.42 现在sqlite3shell 程序默认禁用它。这似乎是新选项 的副作用--unsafe-testing。如果不存在该选项,则包括此设置在内的多个设置都会从默认值切换。
令人高兴的是,用户代码中与数据库的连接不受影响,只是使用标准sqlite3程序建立的连接不受影响。因此,您可以使用 调用它--unsafe-testing,或者在启动 shell 后运行以下命令(每次;它不是持久的):
PRAGMA trusted_schema=1;
Run Code Online (Sandbox Code Playgroud)