PostgreSQL: 查询其它模式表时不引用模式的方法

在数据库维护过程中,生产帐号需要妥善管理,平常开发人员有时需要查看线上数据,一般也只开通查询帐号,这时,如果用查询帐号去访问生产表(其它模式),需要引用模式名,当然,开发人员不愿意这么做,想直接引用表,在 PG 中,虽然有办法满足这个需求,但我个人不建议这么做,因为这不是一个好习惯,偶尔还会带来维护上的麻烦,下面具体演示下:

创建帐号并赋权

1.1 环境信息
PostgreSQL: 9.2
数据库名: skytf
生产帐号: skytf
备注:假如 skytf 为生产库,现在开发人员需要申请 skytf 库的查询权限,给他创建

1.2 创建查询帐号
一个查询帐号,如下:

1
2
postgres=# create role skytf_select login nocreatedb nocreaterole noinherit encrypted password 'skytf_select' CONNECTION limit 10;  
CREATE ROLE

1.3 赋权

1
2
3
4
5
6
7
8
postgres=# /c skytf skytf  
You are now connected to database "skytf" as user "skytf".
skytf=> grant connect on database skytf to skytf_select;
GRANT
skytf=> grant usage on schema skytf to skytf_select;
GRANT
skytf=> grant select on all tables in schema skytf to skytf_select;
GRANT

备注:给查询帐号 skytf_select 赋权,注意以上给的权限。

1.4 测试

1
2
3
4
5
6
7
8
9
10
11
12
skytf=> /c skytf skytf_select;  
You are now connected to database "skytf" as user "skytf_select".

skytf=> select * From products limit 1;
ERROR: relation "products" does not exist
LINE 1: select * From products limit 1;
^
skytf=> select * From skytf.products limit 1;
id | json
----+--------------------------------------------------------------
1 | {"type":"television", "price": 899.99, "resolution":"1080p"}
(1 row)

备注:用 skytf_select 帐号登陆 skytf 库,当引用表不加模式时,报表找不到的错误;在表名前加上模式名时可以找到,接着介绍下不加模式也能引用其它模式表的方法。

更改用户 Search_path

2.1 查看当前 search_path

1
2
3
4
5
6
skytf=> /c skytf skytf_select;  
You are now connected to database "skytf" as user "skytf_select".
skytf=> show search_path; search_path
----------------
"$user",public
(1 row)

备注:当前的搜索模式有两个,首先是 $user,即和用户名同名的模式;第二个为 public 模式。

2.2 更改 skytf_select 用户 search_path

1
2
3
4
skytf=> /c skytf postgres;  
You are now connected to database "skytf" as user "postgres".
skytf=# alter role skytf_select set search_path to skytf,public;
ALTER ROLE

备注:注意上面的命令,没设置好就达不到实验效果。

2.3 再次查看当前 search_path

1
2
3
4
5
6
7
skytf=# /c skytf skytf_select;  
You are now connected to database "skytf" as user "skytf_select".
skytf=> show search_path;
search_path
---------------
skytf, public
(1 row)

备注:search_path 已经包括 skytf 模式了,下面看看不加模式名是否可以找到表。

2.4 测试

1
2
3
4
5
6
7
8
9
10
11
skytf=> select * from products limit 1;  
id | json
----+--------------------------------------------------------------
1 | {"type":"television", "price": 899.99, "resolution":"1080p"}
(1 row)

skytf=> select * from skytf.products limit 1;
id | json
----+--------------------------------------------------------------
1 | {"type":"television", "price": 899.99, "resolution":"1080p"}
(1 row)

备注:引用表名时不加模式也可以正常查询了。

总结

尽管以上实现了引用其它模式表时不加模式的功能,但依然不推荐这么做,因为假如一个库有两个模式 schema_1, schmea_2,并且两个模式下都有表 test_1,那么这时引用表名加模式是明智的,否则很容易造成混淆。

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/237919.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论