我需要参数化一个视图,我这样做是通过创建一个具有视图参数的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
访问似乎要困难得多。
答案 0 :(得分:1)
临时对象是在名为temp
的单独数据库中创建的,因此无法从其他数据库中的触发器访问它们。
将特定于连接的值转换为触发器的其余机制是使用用户定义的函数。