gpt4 book ai didi

sqlite - 在 View 上的触发器中访问临时表

转载 作者:行者123 更新时间:2023-12-03 18:52:21 25 4
gpt4 key购买 nike

我需要参数化 View ,我通过创建 TEMP TABLE 来实现。它具有 View 的参数。

CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
CREATE VIEW tableview AS ...
VIEW相当复杂,但它基本上使用这两个参数来启动递归 CTE,并且我没有找到任何其他方式来表达没有这些参数的 View 。

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

无论如何,只要我创建相同的 TEMP TABLE,这对于创建 View 本身来说都很好。在使用 View 的任何查询开始时,例如:
CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
INSERT INTO parms (parm1,parm2) VALUES (5,66);
SELECT * FROM tableview;

我可以做同样的事情来创建一个触发器以允许在 View 上插入:
CREATE TEMP TABLE parms (parm1 INTEGER, parm2 INTEGER);
CREATE TRIGGER tableinsert INSTEAD OF INSERT ON tableview ...

然而,当我尝试做一个实际的 INSERT (像以前一样首先重新创建 TEMP TABLE)我收到一个错误:
no such table: main.parms

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

我已经查看了 documentation for triggers ,并且它提到了在非临时表上使用临时触发器的警告,但我没有看到任何相反的东西。

我确实在其他地方找到了一个引用,该引用表明“表......必须与触发器附加到的表或 View 存在于同一个数据库中”。我以为临时表是当前数据库的一部分,这不是真的吗?有什么方法可以实现这一点吗?

我还尝试访问 parms表为 temp.parms在 TRIGGER 中,但收到错误:
qualified table names are not allowed on INSERT, UPDATE, and DELETE
statements within triggers

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

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

最佳答案

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

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

关于sqlite - 在 View 上的触发器中访问临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com