2017-08-10 117 views
2

我有一大组用户定义的过程需要在几个单独的目录(数据库)上使用。如何在所有数据库中创建postgres用户定义的函数?

通常在pg_catalog.pg_proc中看到的内置过程似乎是 ,反映在所有数据库的pg_catalog模式中。我希望在postgres数据库中创建一个函数可能会使其全局可用,但是不会,无论是在postgres.pg_catalog还是postgres.public模式中创建。

有谁知道我怎么可以让用户定义的程序普遍可用?

我尝试伪造命名空间和所有者,授予执行公共,并在我的左肩(而不是在满月)持有一只黑猫。

将它设置为扩展工作吗? (这可能需要为我环境的一些谈判和finagling是我没有尝试过的唯一原因。)提前

感谢

+0

你可以把这个函数放在模板数据库中,任何新的数据库都可以拥有它。否则扩展是你最好的选择 –

+0

让它在模板中会让它变成中途的一半,但是让更多的同样东西更新的维护令人头疼。 我会尝试扩展。 谢谢,尼尔。 – user8446599

+0

成功安装了我的第一个postgres扩展,但它仍然有同样的问题。 我在postgres架构中创建了它,并且可以在那里成功调用它,但是从沙箱模式调用唤起'错误:函数...不存在'。投诉。 我不禁想到我错过了其他需要完成的事情。 在postgres.pg_catalog.pg_available_extensions中,plpgsql以1.0作为'installed_version'的值列出 - 这让我认为plpgsql本身 以这种方式加载。 (显然它随处可用。) 有什么建议吗? – user8446599

回答

2

PostgreSQL数据库是相当隔离。你需要在每一个中安装你的扩展。这里有一个shell脚本来缓解你的痛苦:

for DB in $(psql -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')"); do 
    psql -d $DB -c "CREATE EXTENSION IF NOT EXISTS foo" 
done 

或者这是一个数据库,你正在谈论多个模式?

+0

谢谢Neil,有几个数据库,每个数据库都有多个模式,所以shell脚本理论上可行,但将它安装到我们的安全模型中可能需要一分钟;) – user8446599

+0

好方法。你可以用'-f user_func.ddl'替换嵌套的'-c“CREATE EXTENSION ...'来创建一个在所有文件中定义的函数。 – beldaz

相关问题