注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

博客新家:https://postgres.fun/

 
 
 

日志

 
 

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

2012-11-20 14:44:17|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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


一 创建帐号并赋权
--1.1 环境信息
PostgreSQL: 9.2
数据库名: skytf
生产帐号: skytf

    备注:假如 skytf 为生产库,现在开发人员需要申请 skytf 库的查询权限,给他创建
             一个查询帐号,如下:

 

--1.2 创建查询帐号

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


--1.3 赋权

 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 测试

 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

 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

 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

 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 测试

 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,那么这时引用表名加模式是明智
的,否则很容易造成混淆。

  评论这张
 
阅读(19065)| 评论(7)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018