在数据库维护过程中,生产帐号需要妥善管理,平常开发人员有时需要查看线上数据,一般也只开通查询帐号,这时,如果用查询帐号去访问生产表(其它模式),需要引用模式名,当然,开发人员不愿意这么做,想直接引用表,在 PG 中,虽然有办法满足这个需求,但我个人不建议这么做,因为这不是一个好习惯,偶尔还会带来维护上的麻烦,下面具体演示下:
创建帐号并赋权
1.1 环境信息
PostgreSQL: 9.2
数据库名: skytf
生产帐号: skytf
备注:假如 skytf 为生产库,现在开发人员需要申请 skytf 库的查询权限,给他创建
1.2 创建查询帐号
一个查询帐号,如下:
1 |
postgres=# create role skytf_select login nocreatedb nocreaterole noinherit encrypted password 'skytf_select' CONNECTION limit 10; |
1.3 赋权
1 |
postgres=# /c skytf skytf |
备注:给查询帐号 skytf_select 赋权,注意以上给的权限。
1.4 测试
1 |
skytf=> /c skytf skytf_select; |
备注:用 skytf_select 帐号登陆 skytf 库,当引用表不加模式时,报表找不到的错误;在表名前加上模式名时可以找到,接着介绍下不加模式也能引用其它模式表的方法。
更改用户 Search_path
2.1 查看当前 search_path
1 |
skytf=> /c skytf skytf_select; |
备注:当前的搜索模式有两个,首先是 $user,即和用户名同名的模式;第二个为 public 模式。
2.2 更改 skytf_select 用户 search_path
1 |
skytf=> /c skytf postgres; |
备注:注意上面的命令,没设置好就达不到实验效果。
2.3 再次查看当前 search_path
1 |
skytf=# /c skytf skytf_select; |
备注:search_path 已经包括 skytf 模式了,下面看看不加模式名是否可以找到表。
2.4 测试
1 |
skytf=> select * from products limit 1; |
备注:引用表名时不加模式也可以正常查询了。
总结
尽管以上实现了引用其它模式表时不加模式的功能,但依然不推荐这么做,因为假如一个库有两个模式 schema_1, schmea_2,并且两个模式下都有表 test_1,那么这时引用表名加模式是明智的,否则很容易造成混淆。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/237919.html