Выполнить функцию триггеров другой схемы на фактической схеме - PullRequest
0 голосов
/ 13 февраля 2012

мою проблему легко объяснить на примере: у меня есть «общая» схема (общедоступная?), В которой я храню общие данные в кластерном приложении.

Для каждого экземпляра моего приложения у меня есть роль (используется как пользователь приложения). И у меня есть общая роль, app_users, с привилегиями read-only для общей схемы, и каждая роль приложения - это member из app_users.

Теперь моя проблема: как я могу установить триггер на схеме app_a, который выполняет функцию (процедуру) в общей схеме, но влияет на (и только на) таблицы app_a?

Я имею в виду:

// common_scheme, dummy function to emulate the mysql on update = now()
CREATE OR REPLACEFUNCTION update_etime() RETURNS TRIGGER AS $$
    BEGIN 
    NEW.etime = date_part('epoch'::text, now())::int;
    RETURN NEW;
    END;
$$ language plpgsql;

// now, in the app_foo scheme, i have the table:
CREATE TABLE foo_table (fid serial not null primary key unique, label char(25));
// and the trigger:
CREATE TRIGGER foo_table_update_etime BEFORE UPDATE ON foo_talbe FOR EACH ROW EXECUTE PROCEDURE update_etime();
// ERROR:  function update_etime() does not exist
CREATE TRIGGER foo_table_update_etime BEFORE UPDATE ON foo_talbe FOR EACH ROW EXECUTE PROCEDURE common_scheme.update_etime();
// ERROR:  function common_scheme.update_etime() does not exist

Пользователь, который будет обращаться к app_foo, имеет привилегию на выполнение функции update_etime () в common_schema.

Есть идеи?

Я погуглил, но единственное решение, которое я нашел для вызова функций из других схем, это что-то вроде execute 'select * from ' || schema_name || '.table_name';, но я не думаю, что это поможет мне, потому что функция должна работать с локальной схемой .

1 Ответ

2 голосов
/ 13 февраля 2012

Ваш второй набор синтаксиса должен работать ... тот, который имеет "EXECUTE PROCEDURE common_scheme.update_etime();"

Если он не находит функцию, я бы предположил, что вы либо создали ее в другой схемечем вы думаете, что он есть, или вы не создали его вообще (и обратите внимание, ваш пример создания синтаксиса имеет ошибку, нет пробела между «заменить» и «функция», что приведет к ошибке при попытке создать функциюПопробуйте:

\df *.update_etime

Как суперпользователь, чтобы убедиться, что функция существует и находится в том месте, где вы думаете, что она находится. HTH.

...