Schema模式是一系列对象的集合。一个模式只能够被一个数据库用户所拥有,并且模式的名称与这个用户的名称相同。ORACLE 数据库中的每个用户都拥有一个唯一的模式,他所创建的所有模式对象都保存在自己的模式中。模式对象的类型有表、索引、簇、触发器、PL/SQL、序列、同义词、视图、存储过程和存储函数等。目前没有dba_schemas这样的视图,只有dba_users和dba_objects这样的视图。
SQL> conn hr/123456
–上面的hr表示用户
SQL> select count(*) from hr.employees;
–上面的hr表示schema
Profile
现实中使用profile的原因:不同的用户可能需要做不同的限制,这样就需要不同的profile,如果限制要求都一样,可以直接使用default的profile,default profile的值也是可以修改的,比如ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 5
场景1:一个default profile默认登录时输错密码10次就锁定用户,但是一个用户在PDA环境下手工输入密码时容易出错,要求该用户错误1000才锁定,但是不能影响其他用户错误10次就锁定,这就需要新建一个允许错误1000次的profile单独给这个用户使用
场景2:新上线一套程序,为防止程序bug,必须设置这个程序的用户只能创建50个连接,其他用户连接的不受限制,就需要建立一个只有50个连接的profile给这个新上线程序的用户使用
SELECT*FROMdba_profilescreateprofile test123limitPASSWORD_LOCK_TIME2FAILED_LOGIN_ATTEMPTS100SELECT*FROMdba_profilescreateusertest identifiedby123456profile test123createusertest1 identifiedby123456selectusername,profilefromdba_userswhereusernamein('TEST','TEST1')一般DBA搭建好一套环境后,就改如下这个参数,设置为unlimited,即密码永不过期
alter PROFILE default LIMIT PASSWORD_LIFE_TIME unlimited
create user
建立一个用户后,如果不授权,那么这个用户什么都干不了,必须给这个用户授于一些对应的权限
SQL>createusertest identifiedby123456defaulttablespaceUSERS;SQL>conn test/123456ERROR: ORA-01045:userTEST lacksCREATESESSIONprivilege;logon deniedSQL>grantconnect,resource,createview,unlimitedtablespacetotest;备注:实际工作中一般授予两个角色connect,resouce外加create view,unlimited tablespace两个系统权限就可以满足基本的使用要求
SQL>select*from(SELECT*FROMDBA_SYS_PRIVSWHEREGRANTEE='TEST'UNIONALLSELECT*FROMDBA_SYS_PRIVSWHEREGRANTEEIN(SELECTGRANTED_ROLEFROMDBA_ROLE_PRIVSWHEREGRANTEE='TEST'))orderby1;grant权限不会覆盖原有权限,只会追加进去,不要担心
SQL>SELECT*FROMDBA_SYS_PRIVSWHEREGRANTEE='TEST';SQL>grantselectanytabletotest;SQL>SELECT*FROMDBA_SYS_PRIVSWHEREGRANTEE='TEST';–没有create index、insert table、update table、delete table、drop table这种权限,是因为一个用户对其schema下已存在对象具有所有操作权限。
SQL> grant create table to test;
Grant succeeded.
以下操作都会报错ORA-00990
SQL> grant create index to test;
SQL> grant delete table to test;
SQL> grant insert table to test;
SQL> grant update table to test;
SQL> grant drop table to test;
ORA-00990: missing or invalid privilege
WITH ADMIN OPTION的作用,表示被授权的用户可以把该系统权限再授给其他用户
SQL>createusertest1 identifiedby123456;SQL>createusertest2 identifiedby123456;SQL>grantconnect,resourcetotest1;Grantsucceeded.SQL>conn test1/123456Connected.SQL>grantresourcetotest2;ERROR at line1: ORA-01031: insufficientprivilegesSQL>grantconnect,resourcetotest1WITHADMINOPTION;Grantsucceeded.SQL>conn test1/123456Connected.SQL>grantresourcetotest2;Grantsucceeded一个用户A被授予了resource角色的系统权限后,这个A用户可以创建表,A可以看到自己创建的表,但是这个A用户看不到其他用户创建的表,除非给这个用户授予select any table的系统权限或给这个用户授予grant select on schema1.table1 to A的对象权限,然后这个A用户就查询schema1.table1表了
权限的传递继承
with admin option --针对系统权限,回收权限时不会级联回收,站在安全角度看,是很不安全的,故实际工作中几乎很少用到
with grant option --针对对象权限,回收权限时会自动级联回收,实际工作中还是挺常见
权限的授予要慎重,一旦授予,后面要回收会很难,回收了可能会引发对象失效,继而影响生产环境。
比如给一个用户授予了select any table权限,用户创建了一个存储过程,存储过程里面使用了select any table权限去访问很多其他表,一旦要回收用户这个select any table权限,那么存储过程中就无法访问其他表,这个存储过程就会失效会报错,基于这个存储过程的业务就受影响了
查询某个用户具有的所有系统权限
select*from(SELECT*FROMDBA_SYS_PRIVSWHEREGRANTEE='用户名'UNIONALLSELECT*FROMDBA_SYS_PRIVSWHEREGRANTEEIN(SELECTGRANTED_ROLEFROMDBA_ROLE_PRIVSWHEREGRANTEE='用户名'))orderby1;查询某个用户具有的所有对象权限
SELECT*FROMDBA_TAB_PRIVSWHEREGRANTEE='用户名'UNIONALLSELECT*FROMDBA_TAB_PRIVSWHEREGRANTEEIN(SELECTGRANTED_ROLEFROMDBA_ROLE_PRIVSWHEREGRANTEE='用户名');普通用户访问某个数据字典视图,需要赋予这个数据字典视图对应的底层表的对象权限
SQL>conn test/123456SQL>selectcount(*)fromv$session;ERROR ORA-00942:tableorviewdoesnotexistSQL>conn test/123456assysdbaSQL>grantselectonv$sessiontotest;ERROR ORA-02030: can onlyselectfromfixedtables/viewsSQL>grantselectonv_$sessiontotest;Grantsucceeded.SQL>conn test/123456SQL>selectcount(*)fromv$session;COUNT(*)----------35查看resource角色拥有的系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE =‘RESOURCE’
对现有的角色比如resource增加系统权限create view
SQL> grant create view to resource;
假如10个用户都被授予了resource角色,这个10个用户都没有create view权限,此时单独给resource角色授予create view的权限后,这10个用户就可以拥有了create view权限,避免了一一对这个10个用户授予create view权限