Чтобы ответить на вопрос
Вы можете SET
a ( настраиваемый параметр ) примерно так:
SET myvar.role_id = '123';
Но для этого требуется буквальное значение.Также есть функция set_config()
. Цитирование руководства:
set_config(setting_name, new_value, is_local)
... установить параметр и вернуть новое значение
set_config
установить параметр setting_name
в new_value
,Если is_local
равно true
, новое значение будет применяться только к текущей транзакции.
Соответственно, считайте значения опций с SHOW
или current_setting()
.Связано:
Но ваш триггер находится на неправильной таблице (tbl_executor
) с неправильнымсинтаксис.Похоже на код Oracle, где вы можете предоставить код для CREATE TRIGGER
напрямую.В Postgres вам нужна функция триггера первая:
Итак:
CREATE OR REPLACE FUNCTION trg_log_who()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO tbl_log(executor, op)
VALUES(current_setting('myvar.role_id')::int, TG_OP); -- !
RETURN NULL; -- irrelevant for AFTER trigger
END
$func$ LANGUAGE plpgsql;
В вашем примере настройки требуется приведение типа ::int
.
Затем:
CREATE TRIGGER trg_log_who
AFTER INSERT OR UPDATE OR DELETE ON tbl_other -- !
FOR EACH ROW EXECUTE PROCEDURE trg_log_who(); -- !
Наконец, извлечение id
из таблицы tbl_executor
чтобы установить переменную:
BEGIN;
SELECT set_config('myvar.role_id', id::text, true) -- !
FROM tbl_executor
WHERE name = current_user;
INSERT INTO tbl_other VALUES( ... );
INSERT INTO tbl_other VALUES( ... );
-- more?
COMMIT;
Установите третий параметр (is_local
) из set_config()
в true
, чтобы сделать его локальным для сессии как просили.(Эквивалент SET LOCAL
.)
Но почему на строку ?Казалось бы, более разумно сделать это для оператора ?
...
FOR EACH <b>STATEMENT</b> EXECUTE PROCEDURE trg_foo();
Другой подход
Несмотря на это, я бы рассмотрел другой подход: простая функция, возвращающаяid
столбец по умолчанию:
CREATE OR REPLACE FUNCTION f_current_role_id()
RETURNS int LANGUAGE sql STABLE AS
'SELECT id FROM tbl_executor WHERE name = current_user';
CREATE TABLE tbl_log (
executor int DEFAULT f_current_role_id() REFERENCES tbl_executor(id)
, op VARCHAR
);
Затем в функции триггера игнорируйте столбец executor
;будет заполнено автоматически:
...
INSERT INTO tbl_log(op) VALUES(TG_OP);
...
Обратите внимание на разницу между current_user
и session_user
.См .: