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

PostgreSQL 中文网

 
 
 

日志

 
 

How to drop a role in PostgreSQL Server ?  

2012-01-09 21:26:00|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        
          在 PostgreSQL 数据库中," role " 可以理解为 user,即数据库用户, 当删除 PostgreSQL
 的角色时, PostgreSQL 会谨慎对待,当这个用户还拥有数据库对像,或者这个用户在某些数据库
 对像上还拥有权限时,则不能删除,下面简单演示下:      


一 环境准备
--1.1 创建新用户并赋予权限
CREATE ROLE readonly LOGIN  ENCRYPTED PASSWORD 'readonly'
nosuperuser noinherit nocreatedb nocreaterole ;

grant connect on database skytf to readonly;
grant  usage on schema skytf to readonly;
grant select on all tables in schema skytf to readonly;

grant connect on database beha_db to readonly;
grant  usage on schema beha_db to readonly;
grant select on all tables in schema beha_db to readonly;

 备注:这步创建一个新用户 readonly,并赋予数据库 skytf 和 beha_db 所有表的查询权限。
 

--1.2 查询用户 readonly 权限信息
skytf=> \c beha_db beha_db
You are now connected to database "beha_db" as user "beha_db".

select grantor,grantee,table_schema,table_name,privilege_type from
information_schema.table_privileges where grantee='readonly';
  grantor  | grantee  | table_schema |            table_name            | privilege_type
-----------+----------+--------------+----------------------------------+----------------
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20111119 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20111123 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20111225 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20120210 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20120328 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20120514 | SELECT
 beha_db | readonly | beha_db    | tbl_beha_db_stat_20120701 | SELECT
 
beha_db=> \c skytf skytf
You are now connected to database "skytf" as user "skytf".

skytf=> select grantor,grantee,table_schema,table_name,privilege_type from
skytf-> information_schema.table_privileges where grantee='readonly';
 grantor | grantee  | table_schema |          table_name          | privilege_type
---------+----------+--------------+------------------------------+----------------
 skytf   | readonly | skytf        | test_65                      | SELECT
 skytf   | readonly | skytf        | table_b                      | SELECT
 skytf   | readonly | skytf        | test_null                    | SELECT
 skytf   | readonly | skytf        | test_14                      | SELECT
 skytf   | readonly | skytf        | test_aesc                    | SELECT
 
 
--1.3 尝试删除用户 readonly
postgres=# drop role readonly;
ERROR:  role "readonly" cannot be dropped because some objects depend on it
DETAIL:  privileges for database beha_db
privileges for database skytf
2506 objects in database beha_db
265 objects in database skytf

   备注:当删除用户 readonly 时, ERROR 产生,信息如上,根据提示信息,很容易知道是因为用户
             readonly 上还拥有数据库对像,那么如何处理以上问题呢,下面提供两种方法:


二 方法一:使用 "DROP OWNED" 命令删除用户对像和权限
       "Drop owned"  命令用来删除用户的对像信息和权限信息,这个命令具有很大风险,因为此命令作
用是删除用户下的所有对像,使用此命令时,务必谨慎,不要删错数据库对像,关于此命令详细信息,
请参考文档  http://www.postgresql.org/docs/9.1/static/sql-drop-owned.html ,下面继续演示:           

      

--2.1 连接 beha_db 库,删除用户 readonly 的权限信息
beha_db=> \c beha_db postgres
You are now connected to database "beha_db" as user "postgres".
beha_db=# drop owned by readonly;
DROP OWNED


--2.2 连接 skytf 库,删除用户 readonly 的权限信息
postgres=# \c skytf postgres
You are now connected to database "skytf" as user "postgres"..
skytf=#  drop owned by readonly;
DROP OWNED


--2.3 尝试再次删除用户 readonly
postgres=# drop role readonly;
ERROR:  role "readonly" cannot be dropped because some objects depend on it
DETAIL:  privileges for database beha_db

     备注:提示用户 readonly 还有权限信息存在,删除失败。
   

--2.4 删除 readonly 用户的数据库连接权限
postgres=# revoke connect on database beha_db from readonly;
REVOKE
postgres=# revoke connect on database skytf from readonly;
REVOKE


--2.5 再次删除用户,终于删除成功
postgres=# drop role readonly;
DROP ROLE


三 方法二:REVOKE 权限信息
--3.1 创建用户并赋予权限
CREATE ROLE readonly LOGIN  ENCRYPTED PASSWORD 'readonly'
nosuperuser noinherit nocreatedb nocreaterole ;

grant connect on database skytf to readonly;
grant  usage on schema skytf to readonly;
grant select on all tables in schema skytf to readonly;


--3.2 REVOKE权限
skytf=# \c skytf skytf
You are now connected to database "skytf" as user "skytf".

skytf=> revoke connect on database skytf from readonly;
REVOKE
skytf=> revoke select on all tables in schema skytf from readonly;
REVOKE

skytf=> revoke usage on schema skytf from readonly;
REVOKE


--3.3 删除用户
postgres=# drop role readonly;
DROP ROLE

  备注:在删除用户前,需先删除用户的对像和权限信息,才能删除用户,关于这一点,可以参考手册上的
 
 
四 附:手册上的解释 ( drop role )
    A role cannot be removed if it is still referenced in any database of the cluster; an error will be
raised if so. Before dropping the role, you must drop all the objects it owns (or reassign their ownership)
and revoke any privileges the role has been granted. 


五 总结:
     PostgreSQL 在处理删除用户的动作时持谨慎态度,当删除数据库时,首先得保证被删除的用户没有数据库对像,
同时 被删除的用户不拥有任何数据库对像的权限,只有保证了以上两点才能删除成功,而 Oracle 处理此问题没有
这么复杂,当删除用户时,提供一个 cascade 属性,删除用户时可以级连删除这个用户拥有的数据库一切对像。

  评论这张
 
阅读(28179)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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