有人可能会产生疑问,既然数据库的权限管理这么严格,上面我们只是授予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
我们在创建一个用户wangwu。密码也为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,可以这样写;
grant all on mytab to lisi;
如果要把某个权限授予所有的用户,可以使用public关键字:
grant create session to public;
查看当前用户的对象权限,使用如下语句:
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可以查看当前用户
权限的传递:
系统权限的传递:
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 lisi with 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 lisi with grant option;
补充:在连接到数据库时,可以这样写:conn / as sysdba也可以连连上,甚至胡乱指定用户名和密码,如:conn abc/abc as sysdba都可以登陆。这是因为连接是以sysdba身份,首先采用操作系统验证。在我们安装数据库时,会把当前系统的账号添加到oracle的系统管理员组中去。按以上方式连接,它是默认根据系统的当前账户验证通过的。把管理员组中的该系统账号删去后,他就会采用密码验证机制,就必须要指定用户名和密码了。
问题:丢失密码怎么办?
我们知道如果普通用户的密码忘记了,我们可以管理员的身份对该用户的密码进行修改(无法查看,因为密码都是加了密的,只能修改)
可以在图形化的工具下直接进行修改。也可以以命令的方式:
alter user scott identified by tiger;