在VIEW上访问TRIGGER中的TEMP TABLE

时间:2014-06-17 18:35:46

标签: sqlite

我需要参数化一个视图,我这样做是通过创建一个具有视图参数的TEMP TABLE来实现的。

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
CREATE VIEW tableview AS ...

VIEW相当复杂,但它基本上使用这两个参数来启动递归CTE,并且没有任何其他方法可以在没有这些参数的情况下表达视图。

参数必须存储在临时表中,因为每个连接应该能够拥有自己的具有不同参数的视图。

在任何情况下,只要我在使用该视图的任何查询的开头创建相同的TEMP TABLE,这对于创建视图本身都很好,例如:

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
INSERT INTO parms (parm1,parm2) VALUES (5,66);
SELECT * FROM tableview;

我能够做同样的事情来创建一个允许在视图上插入的触发器:

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
CREATE TRIGGER tableinsert INSTEAD OF INSERT ON tableview ...

但是,当我尝试执行实际的INSERT时(先重新创建TEMP TABLE)我收到错误:

no such table: main.parms

如果我创建一个非临时表,我不会收到此错误,但是我遇到的问题是不同的连接不能有自己独立的视图。

我已经审核了documentation for triggers,并提到了在非临时表上使用临时触发器的警告,但我没有看到有关反向的任何内容。

我确实在其他地方找到了一个引用,表明“表格......必须与触发器附加到的表或视图存在于同一个数据库中”。我以为临时表是当前数据库的一部分,这不是真的吗?有没有办法让这个成真呢?

我也尝试在TRIGGER中访问parms表格为temp.parms,但收到了错误:

qualified table names are not allowed on INSERT, UPDATE, and DELETE
statements within triggers

如果我不能使用临时表,是否有办法解决它以完成同样的事情?

更新:好的,所以它似乎是一个SQLite限制。在SQLite源代码中挖掘了一下之后,允许SELECT访问触发器中的临时表似乎非常简单。但是,允许UPDATE访问似乎要困难得多。

1 个答案:

答案 0 :(得分:1)

临时对象是在名为temp的单独数据库中创建的,因此无法从其他数据库中的触发器访问它们。

将特定于连接的值转换为触发器的其余机制是使用用户定义的函数。