第四章 SQL 控制功能
数据库安全 存取控制
准入,标识+口令 权限控制
只能干什么 pk 不能干什么 资源控制
配额:遥远的粮票、阶梯水费、 dos, ddos 跟踪
监视:无处不在的摄像头 审计:一切尽在掌握
存取控制 安全性控制定义
安全性控制保护数据库以防止不合法的使用所造成的数据泄露和破坏。其基本措施是存取控制
安全性措施 物理级 人际级 操作系统级 网络级 数据库系统级
存取控制 权限的转授和回收
允许用户把已获得的权限转授给其他用户,也可以把已授给其他用户的权限再回收上来
权限图 结点是用户,根结点是 DBA ,有向边 Ui→Uj ,表
示用户 Ui 把某权限授给用户 Uj 一个用户拥有权限的充分必要条件是在权限图中有
一条从根结点到该用户结点的路径
存取控制
DBA
U1
U2
U3
U4
U5DBA
U1
U2
U3
U4
U5
DBA
U2
U3
DBA
U2
U3
DBA
U2
U3
DBA
U2
U3
存取控制 授权命令
grant 表级权限 on { 表名 | 视图名 } to
{ 用户 [ ,用户 ]… | public}
[with grant option]
表 级 权 限 包 括 : select, update, insert, delete, index, alter, drop, resource 等以及它们的总和 all ,其中对 select , update 可指定列名with grant option 表示获得权限的用户可以把权限再授予其它用户
存取控制 回收权限
revoke 表级权限 on { 表名 | 视图名 } from
{ 用户 [ ,用户 ]… | public}
收回权限时,若该用户已将权限授予其它用户,则也一并收回。授权路径的起点一定是 DBA
示例 grant select , insert on S to Liming
with grant option
revoke insert on S from Liming
存取控制 支持多库的数据库系统中授权对象可以是数据库
grant 数据库级权限 to { 用户 [ ,用户 ]… | public}
数据库级权限包括:connect :允许用户在 database 语句中指定数据库resource : connect 权限 + 建表、删除表及索引权利dba : resource 权限 + 授予或撤消其他用户的connect 、 resource 、 dba 权限不允许 dba 撤消自己的 dba 权限
存取控制:用户
declare @usr char(30)
set @usr = user
select 'The current user is: '+ @usr
select *
from S
where SNAME = user
• 普通员工只能查看自己的记录• 部门经理可以查看他所管理的员工• 人力资源代表可以查看所有员工
存取控制:角色
角色是一组相关权限的结合,即将多个不同的权限集合在一起就形成了角色
用户
权限
用户
权限
角色
存取控制:角色
存取控制: SQL Server
登录 sp_addlogin sp_revokelogin
角色 sp_addrole sp_droprole
成员 sp_addrolemember sp_droprolemember
安全帐户 sp_grantdbaccess sp_revokedbaccess
报告 sp_helpuser
资源控制: Oracle
CPU 使用时间限制 CPU_PER_SESSION逻辑读个数限制 LOGICAL_READS_PER_SESSION用户会话限制 SESSION_PER_USER会话空闲时间限制 IDLE_TIME会话可持续时间限制 CONNECT_TIME会话专用 SGA 空间限制 PRIVATE_SGA口令限制 PASSWORD_LIFE_TIM
PASSWORD_LOCK_TIME
FAILED_LOGIN_ATTEMPTS
用户
PROFILE
审计 审计就是
对指定用户在数据库中的操作情况进行监控和记录,用以审查用户的相关活动
数据被非授权用户删除,用户越权管理,权限管理不正确,用户获得不应有的系统权限等
监视和收集关于指定数据库获得的数据 哪些表经常被修改,用户共执行了多少次 I/O 操作等,
为优化提供依据
审计 审计级别
语句级只审定某种类型的 SQL 语句
权限级只审计某个系统权限的使用情况
实体级只对一个指定模式上的实体的指定语句进行审计
审计 审计类别
按语句执行成功与否 只审计成功语句 只审计不成功语句 不论成功与否都进行审计
按语句执行次数 会话审计
语句每执行一次就审计一次 存取方式审计
多次执行的同一语句只审计一次
语句级审计 语法
选项:代表某一类 SQL 语句by 用户名 :只审计特定用户的 SQL 语句by Session :按会话方式审计by Access :按存取方式审计Whenever Successful :只审计成功语句Whenever Not Successful :只审计不成功语句
Audit [ NoAudit ] SQL 语句或选项
[ by 用户名 ][ by Session | Access ]
[ Whenever [NOT] Successful
audit table by tom by access
权限级审计 语法
audit create table whenever not successful
Audit [ NoAudit ] 权限名称[ by 用户名 ]
[ by Session | Access ]
[ Whenever [NOT] Successful ]
实体级审计 语法
Audit [ NoAudit ] 实体选项 ON Schema.实体名称
[ by 用户名 ]
[ by Session | Access ]
[ Whenever [NOT] Successful
audit delete on clj.department by session whenever not successful
统计数据库安全性 用户只能查询数据的聚集值,不能访问个体 隐私保护挖掘 漏洞一
个体太少 查询选修“古典哲学史” 的学生的平均成绩
漏洞二 多次查询,太多交叠 查询 n 个学生的总成绩为 x 查询 n 个学生+ A 的总成绩为 y A 的总成绩为 y-x
统计数据库安全性 防范措施
查询引用的数据不能少于 n 两个查询的交不能多于 m 推出个体信息至少需要 1+(n-2)/m 次查询
Student(ID, GPA) , ID 从 1 到 50
任何查询结果只能是一个聚集值每次至少使用 4 条元组
任何两个查询的交不能大于 2 条元组给出一个查询集合,使得能确定 ID=9 的 GPA
SQL 注入 认证过程发出的查询语句
SELECT * FROM users WHERE username = ‘jake’ and PASSWORD = ‘jakespasswd’.
攻击者篡改这个 SQL 语句SELECT * FROM users WHERE username = ‘jake’
and (PASSWORD = ‘jakespasswd’ or ‘x’ = ‘x’).
其他安全概念 自助访问控制和强制访问控制
多级安全级别:绝密 (TS),机密 (S),秘密 (C), 一般(U)
Bell-LaPadula 模型 主体 ( 用户、账户、程序 ) 和客体 ( 关系、元组、列、视
图、操作 )划分到 TS 、 S 、 C 和 U这四个安全性级别中 class(S) 表示主体 S 的许可证, class(O) 表示客体 O
的级别 除非 ,否则不允许主体 S 读访问客体 O 。这被称为简单安全性特性
除非 , 否则不允许主体 S写客体 O 。这被称为* 特性
加密算法: DES , RSA
)()( OclassSclass
)()( OclassSclass
第四章 视图
视图 定义
视图是命名的、从基本表中导出的虚表,它在物理上并不存在,存在的只是其定义
视图中的数据是从基本表中导出的,每次对视图查询都要重新计算
视图之上可以再定义视图 视图 Vs 临时关系变量
视图 V1 视图 V2
基本表 B1 基本表 B3基本表 B2
视图 视图的优点
个性化服务 简化了用户观点,使不同用户可以从不同角度观察同一
数据 安全性
“知必所需”,限制用户数据的访问范围 逻辑独立性
视图作为基本表与外模式之间的映象
视图 定义视图
create view view_name[( 列名 [ ,列名 ] …)]
as (查询表达式)[with check option]
视图的属性名缺省为子查询结果中的属性名,也可以显式指明 with check option 指 明 当 对 视 图 进 行insert , update 时,要检查是否满足视图定义中的条件
撤消视图drop view view_name
视图 示例
create view COMPUTER_PROF
as
(select P# , PNAME , SAL
from PROF , DEPT
where PROF.P# = DEPT.P#
and DEPT.DNAME = “ 计算机系” )
视图 给出计算机系工资超过 800 的老师姓名
select PNAME
from COMPUTER_PROF
where SAL > 800
select PNAME
from PROF, DEPT
where PROF.P# = DEPT.P#
and DEPT.DNAME = “ 计算机系” and SAL > 800
基于视图
视图消解
视图 授权 Tom 只有察看职工平均工资的权限
create view avg_sal as
( select avg(sal) from PROF)
grant SELECT on avg_sal to ”Tom”
视图更新 with check option
create view SC_V as
(select * from SC where GRADE > 85)
with check option
insert into SC_V values(‘s2’, ‘c4’, 82)
视图更新 示例
create view P_SALas (select P# , PNAME , SAL from
PROF )
视图更新create view SN_AGE
as (select SNAME, AGE from S )
视图更新create view S_G(S#, AVERAGE )
as (select S#, avg(GRADE) from SCgroup by S#)
update S_Gset AVERAGE = 85where S# = S1
视图更新create view S_Dean
as (select SNAME, DEAN from S, DEPTwhere S.D# = DEPT.D# )
insert into S_Deanvalues ( “张立” , “叶开”, 97 )
视图更新S# SN AGE D#
s1 张三 20 d1
s2 李四 23 d2
s3 王五 22 d3
null 张立 null null
D# DN DEAN
d1 物理 莫愁d2 数学 乐天d3 化学 安然null null 叶开
SN DEAN
张三 莫愁
李四 乐天
王五 安然
张立 叶开连接属
性连接属
性
视图定义中不包括连接属性 D#
因此 SDEPT 结果中不包括 (张立 , 叶开 )
带标识的 null:⊥i ⊥i = ⊥i ⊥i ≠ ⊥k
视图更新create table T1(col11 int, col12 int)
create table T2(col21 int, col22 int)
create view V1 as
(select col11, col12, col21, col22
from T1 left outer join T2 on col11 = col21)
insert into V1 (col11, col12) values(1, 2)
insert into V1 (col21, col22) values(null, null)
insert into V1 values(1, 2, null, null)
delete from V1
update V1 set col12 = 4 where col11 = 1
update V1 set col12 = 4, col22 = 6 where col11 = 1 and col21 = 1
视图更新create view V2 as
(select col11, col12, col21, col22
from T1 inner join T2 on col11 = col21)
insert into V2 (col11, col12) values(1, 2)
create view V3 as
(select col11, col12, col21, col22
from T1 inner join T2 on col11 = col21)
with check option
insert into V3 (col11, col12) values(1, 2)
视图更新 视图更新约束
select子句中的目标列不能包含聚集函数 select 子句中不能使用 unique 或 distinct 关键字
不能包括 group by子句 不能包括经算术表达式计算出来的列 对于行列子集视图可以更新(视图是从单个基本表
使用选择、投影操作导出的,并且包含了基本表的主码) ( 列举一种不可更新的行列子集视图 )
物化视图 视图的计算结果被实际存储起来 物化视图可以看成是数据库的 cache 查询物化视图比重新计算视图要快许多 需要进行物化视图与基本表之间的一致性维护 应用场合
任何需要快速访问派生数据、或视图的重新计算非常昂贵、或查询需要耗费非常高的 CPU 和磁盘吞吐量的应用场合,都可以使用物化视图来提高效率
物化视图 应用示例
一个零售数据库,存储 terabytes 数量级的几个月的销售数据。而诸如某个商店的某件商品的销售总量这样的查询,每天可能要被零售商、仓库管理员、市场部人员执行若干次。这时可以将商品的销售总量查询结果定义为物化视图
一个处理定单与产品的事务系统,大量的查询需要连接定单与产品表,可以将定单与产品表的连接结果定义为物化视图
物化视图
物化视图: SQL Server
create viewProduct_Totalswith schemabindingasselect productid, total_volume=sum(unitPrice *
Quantity),total_qty = sum(Quantity), number =
count_big(*)from dbo."order details"group by productidcreate unique clustered index PV_IDX
on Product_Totals(productid)
视图索引
物化视图: SQL Server
create table t1(a int , b int , c as a/b)
insert into t1 values(2,0)
create index i1 on t1(c)
create table t2(a int , b datatime , c as dataname(mm , b)
create index i2 on t2(c)
在计算列上创建索引
物化视图: Oracle
create materialized view my_grade_aggsbulid immediaterefresh on commitenable query rewriteasselect S#, avg(GRADE)from SCgroup by S#
select S#, avg(GRADE)from SCwhere S# = s1
物化视图: Oracle
create materialized view SALES_SUMMARY as
select SALES.CUST_ID, TIME.MONTH,
SUM(SALES_AMOUNT) AMT
from SALES, TIME
where SALES.TIME_ID = TIME.TIME_ID
group by SALES.CUST_ID, TIME.MONTH
物化视图: Oracle
select CUSTOMER.CUST_NAME, TIME.MONTH, SUM(SALES.SALES_AMOUNT) from SALES, CUSTOMER, TIMEwhere SALES.CUST_ID = CUST.CUST_ID
and SALES.TIME_ID = TIME.TIME_IDgroup by CUSTOMER.CUST_NAME, TIME.MONTH
重写后的查询为: select CUSTOMER.CUST_NAME,
SALES_SUMMARY.MONTH, SALES_SUMMARY.AMT from CUSTOMER, SALES_SUMMARYwhere CUSTOMER.CUST_ID = SALES_SUMMARY.CUST_ID
物化视图: Oracle
create materialized view sales_mv
as
select sales.cust_id, sum(sales.sales_amount),
time_hierachy.mmyyyy
from sales, time_hierarchy
where sales.trans_date = time_hierarchy.day
group by sales.cust_id, time_hierarchy.mmyyyy
物化视图: Oracle
select sum(sales.sales_amount),
time_hierachy.mmyyyy
from sales, time_hierarchy
where sales.trans_date = time_hierarchy.day
group by time_hierarchy.mmyyyy
select sum(sales.sales_amount),
time_hierachy.qty_yyyy
from sales, time_hierarchy
where sales.trans_date = time_hierarchy.day
group by time_hierarchy.qty_yyyy
物化视图: Oracle
create dimension time_hierarchy_dimlevel day is time_hierarchy.daylevel mmyyyy is time_hierarchy.mmyyyylevel qty_yyyy is time_hierarchy.qty_yyyylevel yyyy is time_hierarchy.yyyy
hierarchy time_rollup(
day child ofmmyyyy child ofqty_yyyy child ofyyyy
)