Доступ к ВРЕМЕННОЙ ТАБЛИЦЕ в ТРИГГЕРЕ в ПРЕДСТАВЛЕНИИ

#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 , поэтому они недоступны из триггеров в других базах данных.

Оставшийся механизм для получения значения, зависящего от соединения, в триггер заключается в использовании определяемой пользователем функции.