执行触发实际chema上另一个模式的功能

时间:2012-02-13 15:13:13

标签: postgresql database-design triggers postgresql-9.1

我的问题很容易用一个例子来解释:我有一个'通用'模式(公共模式?),我在集群应用程序之间存储公共数据。

对于我的应用程序的每个实例,我都有一个角色(用作应用程序用户)。 我有一个共同的角色,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一起工作'计划。

1 个答案:

答案 0 :(得分:2)

您的第二组语法应该有效......带有“EXECUTE PROCEDURE common_scheme.update_etime();

的语法

如果没有找到该功能,我猜你要么在一个不同的模式中创建它,或者你根本没有创建它(请注意,你的例子创建语法有一个错误,“替换”和“函数”之间没有空格,这会在尝试创建函数时导致错误。尝试执行:

\df *.update_etime

作为超级用户验证函数是否存在并且位于您认为它所在的位置.HTH。