我的问题很容易用一个例子来解释:我有一个'通用'模式(公共模式?),我在集群应用程序之间存储公共数据。
对于我的应用程序的每个实例,我都有一个角色(用作应用程序用户)。
我有一个共同的角色,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的用户在common_schema中具有update_etime()函数的执行权限。
有什么想法吗?
我已经google了但是我想要从其他模式中调用函数的唯一解决方案就像execute 'select * from ' || schema_name || '.table_name';
,但我不认为这样做会解决我的问题,因为函数必须与'local一起工作'计划。
答案 0 :(得分:2)
您的第二组语法应该有效......带有“EXECUTE PROCEDURE common_scheme.update_etime();
”
如果没有找到该功能,我猜你要么在一个不同的模式中创建它,或者你根本没有创建它(请注意,你的例子创建语法有一个错误,“替换”和“函数”之间没有空格,这会在尝试创建函数时导致错误。尝试执行:
\df *.update_etime
作为超级用户验证函数是否存在并且位于您认为它所在的位置.HTH。