友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第35部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
从建表到角色授权
创建一个名字为 SALARIES 的表 结构如下
INPUT
SQL》 CREATE TABLE SALARIES (
2 NAME CHAR(30);
3 SALARY NUMBER;
4 AGE NUMBER);
OUTPUT
Table created。
现在 来创建两个用户 Jack 的Jill
INPUT/OUTPUT
SQL》 create user Jack identified by Jack
246
…………………………………………………………Page 247……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
User created。
SQL》 create user Jill identified by Jill
User created。
SQL》 grant connect to Jack
Grant succeeded。
SQL》 grant resource to Jill
Grant succeeded。
分析
到现在为止 你已经创建了两个用户 并且为每个用户分了不同的角色 因此 当他
们在数据库中进行工作时有着不同的能力 在最初创建的表中有如下内容
INPUT/OUTPUT
SQL》 SELECT * FROM SALARIES;
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 61000 55
在本例中你可以按着自己的意愿为该表分配不同的权限 我们假定你具有 DBA 角色
因而具有系统中的一切权利 即使你不是 DBA 角色 你仍然可以对 SALARIES 表进行对
象授权 因为你是它的所有者
由于JACK 的角色了 Connect 所以你只想让他有使用 SELECT 语句的权利
INPUT/OUTPUT
SQL》 GRANT SELECT ON SALARIES TO JACK
Grant succeeded。
因为 JILL 的角色为 Resource 你允许他对表进行选择和插入一些数据 或是严格一些
允许 JILL 修改 SALARIES 表中 SALARY 字段的值
INPUT/OUTPUT
SQL》 GRANT SELECT; UPDATE(SALARY) ON SALARIES TO Jill
Grant succeeded。
现在表和用户都已经创建了 你需要看一下创建的用户在访问表时的不同之处 JACK
和 JILL 都有对 SALARIES 表执行 SELECT 的权限 可是 如果是 JACK 访问表 他可能
会被告知该表不存在 因为 ORACLE 的表名之前需要知道表所有的的用户名或计划名
247
…………………………………………………………Page 248……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
使用表时的限制
这里需要说明一下 你在创建表的时候所使用的用户名假定为 Byran 当 JACK 想从
SALARIES 表中选择数据库 他必须使用该用户名
INPUT
SQL》 SELECT * FROM SALARIES
OUTPUT
ERROR at line 1:
ORA…00942: table or view does not exist
这里 JACK 被告知该表并不存在 现在对表使用用户名来加以标识
INPUT/OUTPUT
SQL》 SELECT * FROM Bryan。SALARIES
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 61000 55
分析
你可以看到现在查询已经工作了 现在我们再来测试一下 JILL 的访问权限 退出 JACK
的登录并以 JILL 的身份登录
INPUT/OUTPUT
SQL》 SELECT * FROM Bryan。SALARIES
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 61000 55
工作正常 现在试着向表中插入一个新的记录
INPUT/OUTPUT
SQL》 INSERT INTO Bryan。SALARIES VALUES('JOE';85000;38)
ERROR at line 1:
ORA…01031: insufficient privileges
分析
248
…………………………………………………………Page 249……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
该操作并没有被执行 因为 JILL 没有在 SALARIES 表中使用 INSERT 语句的权限
INPUT/OUTPUT
SQL》 UPDATE Bryan。SALARIES SET AGE = 42 WHERE NAME = 'JOHN'
ERROR at line 1:
ORA…01031: insufficient privileges
分析
还是不能执行 JILL 只能做他权利范围之内的事情 事实上 ORACLE 非常快地捕捉
到了错误并返馈给了她
INPUT/OUTPUT
SQL》 UPDATE Bryan。SALARIES SET SALARY = 35000 WHERE NAME = 'JOHN'
1 row updated。
SQL》 SELECT * FROM Bryan。SALARIES
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 35000 55
分析
你看到了 JILL 可以进行她所有权限范围内的更新工作
为安全的目的而使用视图
我们在第十天的 创建视图和索引 中曾经提到过视图其实是一种虚表 它可以为用
户提供一种以真实的数据并不相同的显示方式 今天 我们将学习更多的使用视图来实现
安全性的方法 但是 首先 我们需要解释一下视图为什么可以让 SQL 的语句简单化
在早些时候我们曾经学过当一个用户访问一个不为他所有的表的时候 目标必须引用
它所属用户的名字方可正常访问 就像你所想的一样 当你将多个 SQL 语句写在一行时它
将会变得非常的冗长 更重要的是 初学者在可以查看表的内容之前要先知道表的所属用
户名 这并不是你想让你的用户做的工作 下边给出了一个非常简单的解决方案
249
…………………………………………………………Page 250……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
使用表或视图时限制的解决方法
假如你是以 JACK 的身份登录进行系统的 你从早些时候的内容中了解到如果你想查
看表中的内容 你必须使用下边的语句
INPUT
SQL》 SELECT * FROM Bryan。SALARIES
OUTPUT
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 35000 55
如果你创建了一个名字叫 SELECT_VIEW 和视图 那么用户可以非常简单地使用这个
视图
INPUT/OUTPUT
SQL》 CREATE VIEW SALARY_VIEW AS SELECT * FROM Bryan。SALARIES
View created。
SQL》 SELECT * FROM SALARY_VIEW
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 35000
分析
上边的查询返回的结果与使用用户名的返回结果是相同的
用同义词取代视图
SQL 还提供了一种叫同义词的对象 同义词可以为表提供一个别名以将击键的次数减
到最小 同义词有两种 公有的和私有的 任何一个具有 Resource 角色的用户都可以创建
私有类型的同义词 与之相对应的是只有 DBA 角色的用户才能够创建公有类型的同义词
创建公有类型的同义词的语法如下
SYNTAX
CREATE 'PUBLIC' SYNONYM 'schema。'synonym FOR 'schema。'object'@dblink'
250
…………………………………………………………Page 251……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
针对前一个例子 你可以使用下边的语句来取得相同的效果
INPUT/OUTPUT
SQL》 CREATE PUBLIC SYNONYM SALARY FOR SALARIES
Synonym created。
然后再以 JACK 的身份登录并输入
INPUT/OUTPUT
SQL》 SELECT * FROM SALARY
NAME SALARY AGE
JACK 35000 29
JILL 48000 42
JOHN 35000 55
使用视图来解决安全问题
假定你现在又改变主意了 你不想让 JACK 和 JILL 看到 SALARIES 表的全部内容
你可以使用视图来达到只使他们看到属于他们自己的信息这一目的
INPUT/OUTPUT
SQL》 CREATE VIEW JACK_SALARY AS
2 SELECT * FROM BRYAN。SALARIES
3 WHERE NAME = 'JACK';
View created。
INPUT/OUTPUT
SQL》 CREATE VIEW JILL_SALARY AS
2 SELECT * FROM BRYAN。SALARIES
3 WHERE NAME = 'JILL';
View created。
INPUT/OUTPUT
SQL》 GRANT SELECT ON JACK_SALARY TO JACK
Grant succeeded。
INPUT/OUTPUT
SQL》 GRANT SELECT ON JILL_SALARY TO JILL
251
…………………………………………………………Page 252……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Grant succeeded。
INPUT/OUTPUT
SQL》 REVOKE SELECT ON SALARIES FROM JACK
Revoke succeeded。
INPUT/OUTPUT
SQL》 REVOKE SELECT ON SALARIES FROM JILL
Revoke succeeded。
现在 以JACK 的身份登录并测试你为他创建的视图
INPUT/OUTPUT
SQL》 SELECT * FROM Bryan。JACK_SALARY
NAME SALARY AGE
Jack 35000 29
INPUT/OUTPUT
SQL》 SELECT * FROM PERKINS。SALARIES
ERROR at line 1:
ORA…00942: table or view does not exist
退出 JACK 登录并以 JILL 身份登录来测试 JILL
INPUT/OUTPUT
SQL》 SELECT * FROM Bryan。JILL_SALARY
NAME SALARY AGE
Jill 48000 42
ANALYSIS
你可以看到对 SALARIES 表的访问将完全受到视图的控制 SQL 允许你创建这些视图
并把它提供给你的用户 这项技术为你提供了相当大的灵活性
删除同义词的语法如下
SYNTAX
SQL》 drop 'public' synonym synonym_name
注 到现在为止 你应该明白保持有 DBA 角色的用户最少的重要性了吧 因为具有这一
角色的用户可以运行数据库中的任何命令及操作 但是请注意 在 ORACLE 和 Sybase
中你只有成为 DBA 角色的用户才可以从数据库中引入或导出数据
252
…………………………………………………………Page 253……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
使用 WITH GRANT OPTION 子句
如果 JILL 想把她的 UPDATE 权限赋给 JACK 时需要谁来完成这项工作 最初你可能
会认为应该由 JILL 来完成 因为她有 UPDATE 权限 她应该可以为其他用户受予这个权
限 但是 如果你使用早些时候的 GRANT 语句 JILL 并不能为其他用户授权
SQL》 GRANT SELECT; UPDATE(SALARY) ON Bryan。SALARIES TO Jill
下边是我们在今天早些时候讲过的 GRANT 语句的语法
SYNTAX
GRANT {object_priv | ALL 'PRIVILEGES'} ' (column '; column'。。。) '
'; {object_priv | ALL 'PRIVILEGES'} ' (column'; column' 。。。) ' ' 。。。
ON 'schema。'object TO {user | role | PUBLIC} '; {user | role | PUBLIC}' 。。。
'WITH GRANT OPTION'
看到在末尾的 WITH GRANT OPTION 语句了吗 当在给对象授权时如果使用了这个
选项 那么该权限就可以被传给其他的用户 所以 如果你想让 JILL 具有给 JACK 授权的
能力 那么你应该像下边这样使用 GRANT 语句
INPUT
SQL》 GRANT SELECT; UPDATE(SALARY)
2 ON Bryan。SALARIES TO JILL
3 WITH GRANT OPTION
OUTPUT
Grant succeeded。
当以 JILL 的身份登录时就可以使用下边的语句
INPUT/OUTPUT
SQL》 GRANT SELECT; UPDATE(SALARY) ON Bryan。SALARIES TO JACK
Grant succeeded。
总结
如果数据库的管理人员如果对数据库的安全考虑不周常常会导致许多问题 幸运的是
SQL 提供了几个非常有用的命令来实现数据库的安全性
253
…………………………………………………………Page 254……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
用户最初可由 CREATE USER 命令来创建 这里可以设定用户名和密码 当用户的帐
号生效以后 必须为其指定角色以使其可以工作 在 ORACLE 中有三种可用的角色 分别
了 Connect Resource 和 DBA 角色 每种角色有不同的访问数据库的资格 Connect 最少
而 DBA 则拥有全部的访问能力
GRANT 命名可以对用户进行授权 REVOKE 命令则可以取消对用户的授权 权限可
分为对象权限和系统权限 系统权限应该严格控制 不能授予没有使用经验的用户 如果
他们得到了这种权限他们就可能 也许是不经意之间 毁坏你辛苦构建的数据库 对象权
限则可以让用户具有访问个别的由已存在用户所创建的模块中的对象的能力
所有的这些技术和语句都为 SQL 的用户提供了相当广泛的用以设置安全性的工具 尽
管我们讨论的主要是 ORACLE 7 的安全特性 但是你可以在设计你自己的数据库时用到这
些信息 切记不论你使用哪一种数据库产品 它都提供了一定程度的安全性
问与答
问 我知道安全性是需要的 但是否 ORACLE 做的太多了
答 不 一点也不多 尤其是当在大型的多用户应用场合时更是这样 由于使用数据库的
不同用户所做的工作也并不相同 所以你需要限制用户让他们能做什么或不能做什么 用
户应该只能进行他所处角色和权限许可内的工作
问 看来 DBA 用户在创建我的帐号时已经知道了我的密码 是否是这样 这是一个安全
问题
答 确实是这样 DBA 创建了你的用户和密码 所以你应该在收到创建信息以后立即使用
ALTER USER 命令来更改 ID 和密码
校练场
1 下边的语句是否是错误的
SQL》 GRANT CONNECTION TO DAVID
2 对与错 当删除用户时所有属于用户对对象都会随之删除
3 如果你创建了一个表并对它使用了 SELECT 权限对象为 PUBLC 时会有什么问题
4 下边的 SQL 语句是否正确
SQL》 create user RON identified by RON
254
…………………………………………………………Page 255……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
5 下边的 SQL 语句是否正确
SQL》 alter RON identified by RON
6 下边的 SQL 语句是否正确
SQL》 grant connect; resource to RON
7 如果表为你所有 别人如何才能从表中选择数据
练习
作为数据库安全性的练习 请你创建一个表 然后再创建一个用户 为该用户设置不
同的安全性并测试
255
…………………………………………………………Page 256……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第 13 天 高级 SQL
目标
在之前的 12 天中 我们学习了许多关于如何写
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!