#sqlite
#sqlite
Вопрос:
Мне нужно параметризовать представление, и я делаю это, создавая a 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
Если я создаю невременную таблицу, я не получаю эту ошибку, но тогда у меня возникает проблема, заключающаяся в том, что разные соединения не могут иметь свои собственные отдельные представления.
Я просмотрел документацию по триггерам, и в ней упоминаются предостережения об использовании временных триггеров для невременной таблицы, но я ничего не вижу относительно обратного.
Я нашел ссылку в другом месте, в которой указывалось, что «таблица … должна существовать в той же базе данных, что и таблица или представление, к которым подключен триггер». Я думал, что временная таблица является частью текущей базы данных, разве это не так? Есть ли какой-нибудь способ сделать это правдой?
Я также попытался получить доступ к parms
таблице, как temp.parms
в ТРИГГЕРЕ, но получил сообщение об ошибке:
qualified table names are not allowed on INSERT, UPDATE, and DELETE
statements within triggers
Если я не могу использовать временную таблицу, есть ли какой-нибудь способ обойти ее, чтобы выполнить то же самое?
Обновление: Хорошо, похоже, это ограничение SQLite. Немного покопавшись в исходном коде SQLite, кажется довольно тривиальным разрешить SELECT
доступ к временной таблице в триггере. Однако разрешить UPDATE
доступ, похоже, намного сложнее.
Ответ №1:
Временные объекты создаются в отдельной базе данных с именем temp
, поэтому они недоступны из триггеров в других базах данных.
Оставшийся механизм для получения значения, зависящего от соединения, в триггер заключается в использовании определяемой пользователем функции.