我试过做:
CREATE RolE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATERolE;
它是否正确?如何将CREATERolE授予多个数据库?
解决方法 似乎这不是一个简单的方法.但您可以使用安全定义器选项创建功能以实现所需的行为:create or replace function fn_create_role(p_name text,p_password text,p_databases text[]) returns voID language plpgsql security defineras $$begin execute format('create role %I with login password %L;',p_name,p_password); execute format('grant connect on database %s to %I',array_to_string(p_databases,','),p_name); return;end $$;
以超级用户身份创建此功能.
然后,您可以使用NOCREATERolE选项创建角色,但向其授予此函数的EXECUTE特权,并使用它来创建其他角色.
注意:您需要从特定数据库的公共角色撤消连接选项,以禁止默认情况下角色连接到它们,例如:
revoke connect on database db1,db2 from public;
测试一下:
作为超级用户(在我的情况下,nd也拥有同名的架构)
postgres=# create database db1; create database db2;CREATE DATABASECREATE DATABASEpostgres=# revoke connect on database db1,db2 from public;REVOKEpostgres=# create role foo with login password 'bar' nocreatedb nocreaterole;CREATE RolEpostgres=# set role foo;SETpostgres=> create role win with login password 'amp' nocreatedb nocreaterole;ERROR: permission denIEd to create rolepostgres=> set role nd;SETpostgres=# grant usage on schema nd to foo;GRANTpostgres=# grant execute on function nd.fn_create_role(text,text,text[]) to foo;GRANTpostgres=# set role foo;SETpostgres=> select nd.fn_create_role('win','amp','{db1}');┌────────────────┐│ fn_create_role │╞════════════════╡│ │└────────────────┘(1 row)
在终端:
$psql -h localhost -d db1 -U winPassword for user win: psql (9.6.3)SSL connection (protocol: TLSv1.2,cipher: ECDHE-RSA-AES256-GCM-SHA384,bits: 256,compression: off)Type "help" for help.win@db1=> \q$psql -h localhost -d db2 -U winPassword for user win: psql: FATAL: permission denIEd for database "db2"DETAIL: User does not have CONNECT privilege.总结
以上是内存溢出为你收集整理的postgresql – Postgres CREATEROLE对特定数据库的限制全部内容,希望文章能够帮你解决postgresql – Postgres CREATEROLE对特定数据库的限制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)