• oracle数据库权限管理


    权限管理: oracle 9里面默认的三个username和password: sys change_on_install //权限最高的管理员 system manager //普通的管理员 scott tiger //普通用户 在oracle 10中,仍然使用这三个用户作为默认用户。

    但sys和system用户的password不再默认。


      权限管理:

      oracle 9里面默认的三个username和password:

      sys change_on_install //权限最高的管理员

      system manager //普通的管理员

      scott tiger //普通用户

      在oracle 10中,仍然使用这三个用户作为默认用户。但sys和system用户的password不再默认。在安装数据库的时候。能够由用户指定 。

    从安全角度考虑,scott用户默认被锁定,所以要使用该用户,

    须要先解除锁定。



      注意:我们要使用oracle数据库,至少要启动两个服务,一个是监听服务,一个是数据库实例。



      创建用户;

      以系统管理员的身份登陆。

      使用语句:create user lisi identified by lisi; //创建了一个叫lisi的用户,password也为lisi

      尽管创建了用户。但该用户如今并无不论什么权限。

    就连登陆数据库的权限都没有。假如使用:sqlplus lisi/lisi 登陆数据库,会报错,显示没有create session的权限。

      所以还是先使用系统管理员给lisi这个用户指定登陆的权限。

      语句为:grant create session to lisi;

      授权过后。lisi能够登陆数据库了。可是如今还没有创建数据库表的权限。仍需指定。

      语句为:grant create table to lisi;

      使用lisi账号,创建数据库表:create table mytable(id int);

      运行后却提示错误:对表空间‘USERS’无权限。每一个数据库表都有自己的表空间,相当于文件必须位于某个目录下。

      尽管lisi用户具有创建表的权限,但没有使用表空间的权限,终于还是创建不了表。

    这就好比你有我房间的钥匙。可是没有我家大门的钥匙,你终于还是进不了我的房间。



      通过系统管理员授予lisi用户使用表空间的权限:

      grant unlimited tablespace to lisi;这样用户lisi对表空间的使用就没有限制了。

      在lisi账户下,创建表:create table mytable(id int);

      插入一条记录:insert into mytable values(1);

      插入成功。



      也能够删除表:drop table mytable;

      有人可能会产生疑问,既然数据库的权限管理这么严格。上面我们仅仅是授予lisi用户创建表的权限。并没有授予其插入,删除等权限呀。这里我们能够这样理解:当前用户创建了一个表。那么该表

    就属于该用户,用户既然创建了表,自然就对该表拥有一切权限啦。



      并且:数据库并没有drop table的权限。使用:grant drop table to lisi;出现:权限缺失或无效的错误提示。



      上面是授予权限。那么怎样撤销用户的某个权限呢?

      使用例如以下语句能够撤销lisi的创建表的权限:revoke create table from lisi;

      再使用lisi账号创建表。就会出现错误提示:权限不足。



      在大多情况下。假设我们对用户的权限常常改动,我们怎样知道用户有哪些权限呢?

      数据库默认维护了一个视图对外提供一些系统信息(叫数据字典),能够查看用户的详细权限。

      使用例如以下语句查看当前用户的系统权限:

      select * from user_sys_privs;

      USRENAME PRIVILEGE ADM

      ----------------------------------------------- ---------------------------------------- ----

      LISI CREATE SESSION NO

      LISI UNLIMITED TABLESPACE NO

      oracle中的权限分为系统权限和对象权限。

      系统权限就是我们上面所讲的一些权限。



      对象权限是指:比方用户lisi创建了一个表,该表就能够作为一个对象看待。另外一个用户是否有訪问该表的权限呢。这就是所谓的对象权限管理。

      我们在创建一个用户wangwu。password也为wangwu。在该用户下,创建一个表mytab。假设lisi用户向訪问表mytab,是否会成功呢?

      在lisi的窗体下。输入:select * from mytab;报错:表或视图不存在。

    我们知道表属于表的创建者。

      这里我们直接查询表mytab,数据库会到当前用户下寻找该表。显然当前用户lisi没有表mytab。

    所以提示表或视图不存在。

      那我们指定表的全部者。再次查询:select * from wangwu.mytab;窗体显示“权限不足”的错误提示。

    由此可知。尽管找到了mytab表,却没有訪问的权限。

      仅仅有表的拥有者才干够授予该表的相关权限给其它用户。

    使用用户wangwu的操作窗体。使用例如以下语句,把查询语句授予lisi;

      grant select on mytab to lisi;

      运行此语句后。lisi就能够查询用户wangwu的mytab表了。

      假设要获得其它对于mytab表的权限,仍然须要指定(多个权限同一时候指定。用逗号分隔):

      grant update,select,delete on mytab to lisi;

      假设要把表的全部权限都赋予给用户lisi。能够这样写;

      grantallon mytab to lisi;

      在wangwu的窗体下,向mytab插入几条数据。然后查询。却显示“未选定行”。说明刚才的插入没有同步到数据库中去。



      在oracle下。默认须要对sql语句手动进行提交。所以在几条插入语句后,能够运行commit;语句提交。再次查询,表中就有数据了。

      假设要把某个权限授予全部的用户。能够使用publickeyword:

      grant create session topublic;

      查看当前用户的对象权限。使用例如以下语句:

      select * from user_tab_privs;

      oracle的权限控制粒度非常细,甚至能够精确到某一列的权限。



      grant update(name) on mytab to lisi;

      这句运行的效果就是,lisi用户对表mytab仅拥有更新name这一列的权限。



      grant insert(id) on mytab to lisi;

      查看当前用户对数据库表的列的权限:

      select * from user_col_privs;

      在lisi权限下,运行:update wangwu.mytab set name='fdsfa',id="dfs" where id=1;

      运行后显示权限不足。



      update wangwu.mytab set name="fsa" where id=1;

      这样就能够了。

      相同运行:insert into wangwu.mytab values(4,"asf");运行后也显示权限不足。

      改动语句为:inset into wangwu.mytab(id) values(4);成功运行。

      仅仅能对更新和插入设定精确到某列的权限控制,不能对查询和删除设定。



      命令: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三种登陆验证机制

      操作系统验证

      password文件验证

      数据库验证

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

      而相应sys用户。它的权限是最大的。它的权限甚至包含启动和关闭数据库。它在oracle数据库还没启动时,就连接到oracle数据库中去,进行启动。

    这样我们不难理解。sys的身份验证不可能採用数据库验证,由于当时数据库还没有启动呢。所以sys的身份验证使用的是操作系统验证和password文件验证(这样说不是非常严格,应该是以SYSDBA和SYSOPER连接身份登陆都会以这两种方式进行验证)。

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

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

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

      sqlplus sys/oracle as sysdba//启动数据库实例的请求。发现以sysdba的身份连接,所以不进行数据库验证,而是採用操作系统和password文件验证。假设验证通过。执行启动数据库实例

      startup //启动数据库实例

      早期版本号命令得这样写:

      lsnrctl start

      sqlplus /nolog

      conn sys/oracle as sysdba

      startup

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

      lsnrctl start

      oradim -starup -sid orcl

      补充:在连接到数据库时。能够这样写:conn / as sysdba也能够连连上。甚至胡乱指定username和password,如:conn abc/abc as sysdba都能够登陆。这是由于连接是以sysdba身份,首先採用操作系统验证。

    在我们安装数据库时。会把当前系统的账号加入到oracle的系统管理员组中去。按以上方式连接。它是默认依据系统的当前账户验证通过的。把管理员组中的该系统账号删去后。他就会採用password验证机制。就必需要指定username和password了。

      问题:丢失password怎么办?



      我们知道假设普通用户的password忘记了,我们能够管理员的身份对该用户的password进行改动(无法查看,由于password都是加了密的,仅仅能改动)

      能够在图形化的工具下直接进行改动。

    也能够以命令的方式:

      alter user scott identified by tiger;

      在实际开发中。我们要把操作系统验证给取消掉。那以后就会採用password验证了。

    可是假如我们把password忘记了,又怎样解决呢?

      我们能够把password文件删掉,在生成一个password文件就可以。

      找到password文件的所在地:..db_2databasepwdorcl.ora,红色部分是该password文件命名的固定部分,orcl指的是数据库的sid。可能不一样

      删除password文件后,再生成一个。使用orapwd命令,详细例如以下:

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

      演示样例:orapwd file=E:oracleora92databasepwdora9i.ora password=sys entries=10;

      使用下面语句查看在该password文件里放了多少特权用户:

      select * from v$pwfile_users;

      创建用户:

      create user username

      identified by password

      default tablespace 表空间

      temporary tablespace 表空间

      quota 整数 K|M|unlimited on 表空间

      演示样例:

      create user abc

      identified by abc

      default tablespace users //用户的默认表空间为users。在该表空间下用户能够创建表

      temporary tablespace temp //用户的暂时表空间,用于索引,排序等工作的暂时场所。相当于windows下的暂时目录

      quota 50M on users //指定users表空间的限额大小

      quota unlimited on temp; //指定暂时表空间的限额大小

      限制用户

      用户加锁

      alter user username account lock

      用户解锁

      alter user username account unlock

      用户口令即刻失效

      alter user username password expire

      删除用户:

      drop user username [cascade]

      cascade 用在当被删除的用户下还有未删除的对象(如一些表)时。强制级联删除。它表示删除用户全部对象。


  • 相关阅读:
    是用VLC API将RTSP流convert为视频文件
    VLC命令行的应用
    OpenRTSP的使用
    (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    寻找轮廓的中点
    (4程序框架)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    初步实现GoQtTemplate
    特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6756667.html
Copyright © 2020-2023  润新知