мою проблему легко объяснить на примере: у меня есть «общая» схема (общедоступная?), В которой я храню общие данные в кластерном приложении.
Для каждого экземпляра моего приложения у меня есть роль (используется как пользователь приложения).
И у меня есть общая роль, 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';
, но я не думаю, что это поможет мне, потому что функция должна работать с локальной схемой .