【问题标题】:Accessing a TEMP TABLE in a TRIGGER on a VIEW在视图上的触发器中访问临时表
【发布时间】:2014-06-17 18:35:45
【问题描述】:

我需要对视图进行参数化,为此我创建了一个包含视图参数的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 中以temp.parms 的身份访问parms 表,但出现错误:

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

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

更新:好的,所以这似乎是一个 SQLite 限制。在深入研究了 SQLite 源代码之后,允许SELECT 访问触发器中的临时表似乎很简单。但是,允许UPDATE 访问似乎要困难得多。

【问题讨论】:

    标签: sqlite


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多