oracle数据库权限管理(二)

2014-11-24 15:01:25 · 作者: · 浏览: 1


  命令:show user可以查看当前用户

  数据库有三种类型的语句:

  ddl:数据定义语言,指定是数据库表的创建,删除之类的操作。

  dml:数据操纵语言,针对表的增删改查操作,只有dml需要进行提交操作。

  dcl:数据控制语言,对系统权限和对象权限的管理。

  权限的传递:

  系统权限的传递:

  sys用户把一些系统权限授权给lisi用户.

  grant alter any table to lisi;

  查看lisi的系统权限,就有了alter any table的权限。

  现在lisi想把该权限传递授权给wangwu用户执行以下语句:grant alter any table to wangwu;执行后报“权限不足”。

  要想lisi也可以传递权限,可以在sys用户授权时加上with admin option的选项,该选项就说明了还拥有权限的管理能力。

  即:grant alter any table to lisiwith admin option;这样lisi就可以把alter any table的权限传递给wangwu了。

  要想wangwu也可以传递该权限,也使用该admin选项即可。

  查看lisi的系统权限,他的alter any table权限的同一行的adm字段取值由NO变为YES,说明lisi对该权限具有分配功能了。

  对象权限的传递:

  与系统权限的传递类似,不过后面的选项有所改变:

  加入sys创建了一个A表。授予lisi的select权限:

  grant select On A to lisi;

  如果想让lisi拥有对A表的select权限的分配能力,只需修改为:

  grant select On A to lisiwithgrantoption;

  思考:如果sys管理员撤销了lisi的权限,那么wangw的权限是否也被撤销了呢

  通过角色对权限进行管理

  如果按照上面的权限管理方法 ,对每个用户逐一的分配权限,必然会很混乱,导致管理的困难。所以oracle提供了角色来对权限进行集合化的管理。

  角色就是权限的集合。

  在sys下创建角色:

  create role myrole;

  给角色添加权限:

  grant create session to myrole;

  grant create table to myrole;

  创建用户:

  create user zhangsan;

  grant myrole to zhangsan;//赋予以上的两个权限给zhangsan

  有些系统权限无法直接赋予角色,因为该权限太大了,比如unlimited tablespace。

  例如:执行grant unlimited tablespace to myrole;

  出现错误提示:无法将unlimited tablespace授予角色

  删除角色:

  drop role myrole;

  权限举例:

  create table create any table

  [alter table] alter any table

  [delete table] delete any table

  补充:oracle数据库不含紫色的权限类型。因为有了create table权限,说明表的一切都归创建者。不需要还指定alter table和drop table权限了,默认就有了。

  而create any table这个权限表明该用户可以给其他用户创建表。

  示例:wangwu给lisi创建一个表temp

  create tablelisi.temp(id int);//有可能报“超出表空间‘USERS’的空间限额”错误提示,那是因为lisi用户可能还没有表空间权限,执行赋予lisi用户unlimited tablespace的权限,问题即可

解决。

  注意:表是属于某个用户的。而角色不属于某个用户。

  oracle三种登陆验证机制

  操作系统验证

  密码文件验证

  数据库验证

  对于绝大多少的普通用户而言,数据库启动后,用户登陆时采用的是数据库验证。

  而对应sys用户,它的权限是最大的。它的权限甚至包括启动和关闭数据库。它在oracle数据库还没启动时,就连接到oracle数据库中去,进行启动。这样我们不难理解,sys的身份验证不可能采用数据库验证,因为当时数据库还没有启动呢。所以sys的身份验证使用的是操作系统验证和密码文件验证(这样说不是很严格,应该是以SYSDBA和SYSOPER连接身份登陆都会以这两种方式进行验证)。

  当一个用户连接数据库的时候,客户端首先连接到监听服务,监听把请求发送到数据库,如果验证通过了,以后就不需要监听了,客户端直接和数据库实例通信。

  早期在linux和unix上运行的oracle,它有严格的启动顺序:先启动监听(只需要敲个命令即可,不需要什么权限),后启动数据库实例(需要权限)

  执行的命令序列:lsnrctl start //启动监听服务

  sqlplus sys/oracle as sysdba//启动数据库实例的请求,发现以sysdba的身份连接,所以不进行数据库验证,而是采用操作系统和密码文件验证。如果验证通过,运行启动数据库实例

  startup //启动数据库实例

  早期版本命令得这样写:

  lsnrctl start

  sqlplus /nolog

  conn sys/oracle as sysdba

  startup

  在 windows下oracle的启动过程,进行了傻瓜式的封装:

  lsnrctl start

  oradim -starup -sid orcl

  补充:在连接到数据库时,可以这样写:conn / as sysdba也可以连连上,甚至胡乱指定用户名和密码,如:conn abc/abc as sysdba都可以登陆。这是因为连接是以sysdba身份,首先采用操作系统验证。在我们安装数据库时,会把当前系统的账号添加到oracle的系统管理员组中去。按以上方式连接,它是默认根据系统的当前账户验证通过的。把管理员组中的该系统账号删去后,他就会采用密码验证机制,就必须要指定用户名和密码了。

  问题:丢失密码怎么办

  我们知道如果普通用户的密码忘记了,我们可以管理员的身份对该用户的密码进行修改(无法查看,因为密码都是加了密的,只能修改)

  可以在图形化的工具下直接进行修改。也可以以命令的方式:

  alter user scott identified by tiger;

  在实际开发中,我们要把操作系统验证给取消掉。那以后就会采用密码验证了。但是假如我们把密码忘记了,又如何解决呢

  我们可以把密码文件删掉,在生成一个密码文件即可。

  找到密码文件的所在地:..\db_2\database\pwdorcl.ora,红色部分是该密码文件命名的固定部分,orcl指的是数据库的sid,可能不一样

  删除密码文件后,再生成一个。使用orapwd命令,具体如下:

  orapwdfile=<密码文件的全路径,密码文件的命名要按照先前> password=<指定的密码> entries=<该密码文件保存的DBA最大数量> force=只是否强制覆盖文件操作

  示例:orapwd file=E:\oracle\ora92\database\pwdora9i.ora password=sys entries=10;

  使用以下语句查看在该密码文件中放了多少特权用户:

  select * from v$pwfile_users;