-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy path3、完整性和安全性.md
398 lines (271 loc) · 13.9 KB
/
3、完整性和安全性.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
### 完整性和安全性
#### 完整性
关系模型中有完整性要求
* 实体完整性:主要指是否允许 null 值
* 参照完整性:指所关联关系的完整性
* 用户自定义完整性:指是否满足用户的条件
按约束来源分类
* 结构约束
* 来自于模型的约束,例如函数依赖约束、主键约束(实体完整性)、外键约束(参照完整性),只关心数值相等与否、是否允许空值等;
* 内容约束
* 来自于用户的约束,如用户自定义完整性,关心元组或属性的取值范围。例如Student表的Sage属性值在15岁至40岁之间等。
按约束对象分类
* 域完整性约束条件
* 施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的
* 关系完整性约束条件
* 施加于关系/table上,对给定table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断
按约束状态分类
* 静态约束
* 要求DB在任一时候均应满足的约束;例如Sage在任何时候都应满足大于0而小于150(假定人活最大年龄是150)。
* 动态约束
* 要求DB从一状态变为另一状态时应满足的约束;例如工资只能升,不能降:工资可以是800元,也可以是1000元;可以从800元更改为1000元,但不能从1000元更改为800元。
完整性约束条件(或称完整性约束规则)的一般形式:Integrity Constraint ::= ( O,P,A,R)
* O:数据集合:约束的对象?,即列、多列(元组)、元组集合
* A:触发条件:什么时候检查?
* P:谓词条件:什么样的约束?
* R:响应动作:不满足完整性约束时怎么办?
#### 完整性约束
SQL语言支持如下几种约束
* 静态约束(通过 DDL)
* 列完整性—域完整性约束
* 表完整性--关系完整性约束
* 动态约束(通过触发器)
* 触发器
静态完整性(Create Table)
* CreateTable有三种功能:
* 定义关系模式
* 定义完整性约束:表完整性、列完整性
* 定义物理存储特性
```sql
CREATE TABLE tablename
( colname datatype // 映射
[ DEFAULT { default_constant | NULL} ] // 默认值
[ col_constr{col_constr. . .} ] // 列约束
[, table_constr{ table_constr ...}] // 表约束,可以有多个,用”,“隔开即可
[, colname datatype
[DEFAULT { default_constant | NULL} ]
[col_constr {col_constr. . .} ]
[, table_constr{ table_constr ...}]]
.. .)
```
* Col_constr 列约束
```sql
{ NOT NULL | //列值非空
[ CONSTRAINT constraintname] //为约束命名,便于以后撤消
{UNIQUE //列值是唯一| PRIMARY KEY //列为主键
| CHECK (search_cond) //列值满足条件,条件只能使用列当前值
| REFERENCES tablename[(colname) ] //引用另一表tablename的列colname的值
[ON DELETE { CASCADE | SET NULL }]}} //
```
示例
```sql
Create Table Student (S# char(8) not null unique,
Sname char(10),
Ssexchar(2) constraint ctssex check (Ssex=‘男’ or Ssex=‘女’),
Sage integer check (Sage>=1 and Sage<150),
D# char(2) references Dept(D#) on delete cascade, Sclasschar(6))
```
```sql
Create TableCourse (C# char(3) ,
Cname char(12),
Chours integer,
Credit float(1) constraint ctcredit check (Credit >=0.0 and Credit<=5.0 ),
T# char(3) references Teacher(T#) on delete cascade);
```
* table_constr 表约束(用” ,“ 隔开,可以定义多个)
```sql
[ CONSTRAINT constraintname] //为约束命名,便于以后撤消
{ UNIQUE (colname {, colname. . .}) //几列值组合在一起是唯一
| PRIMARY KEY (colname {, colname. . .}) //几列联合为主键
| CHECK (search_condition) //元组多列值共同满足条件,条件中只能使用同一元组的不同列当前值
| FOREIGN KEY (colname {, colname. . .}) REFERENCES tablename [(colname {, colname. . .})]
[ON DELETE CASCADE] }//引用另一表tablename的若干列的值作为外键
```
示例
```sql
Create Table Student (S#char(8) not null unique,
Sname char(10),
Ssex char(2) constraint ctssex check (Ssex=‘男’or Ssex=‘女’),
Sage integer check (Sage>1 and Sage<150),
D# char(2) references Dept(D#) on delete cascade,
Sclass char(6) ,
primary key(S#) )
```
```sql
Create Table Course (C# char(3) ,
Cname char(12),
Chours integer,
Credit float(1) constraint ctcredit check (Credit >=0.0 and Credit<=5.0 ),
T# char(3) references Teacher(T#) on delete cascade,
primary key(C#),
constraint ctcc check(Chours/Credit = 20));
```
```sql
Create Table SC (S#char(8), C#char(3),
Scorefloat(1) constraint ctscore check (Score>=0.0 and Score<=100.0),
constraint fk_s forergn key (S#) references student(S#) on delete cascade,
constraint fk_c forergn key (C#) references course(C#) on delete cascade )
```
* 撤消或追加约束
```sql
ALTER TABLE tblname
[ADD ( { colname datatype [DEFAULT {default_const|NULL} ]
[col_constr {col_constr...} ] [, table_constr] }
{, colname...}) ]
[DROP { COLUMN columnname | (columnname {, columnname...})}]
[MODIFY ( { colname datatype [DEFAULT {default_const|NULL} ]
[col_constr {col_constr...} ] [, table_constr] }
{, columnname. . .})]
[ADD CONSTRAINT constr_name] // 后面这三个都是表约束
[DROP CONSTRAINT constr_name]
[DROP PRIMARY KEY ] ;
```
示例
```sql
// 修改列约束
Alter Table SC Modify ( Score float(1)
constraint nctscore check (Score>=0.0 and Score<=150.0) )
// 删除表约束
Alter Table SC DROP CONSTRAINT ctscore;
// 增加表约束
Alter Table SC Add Constraint nctscore check (Score>=0.0 and Score<=150.0) );
```
动态约束(触发器Trigger)
* Create Table 中的表约束和列约束基本上都是静态的约束,也基本上都是对单一列或单一元组的约束(尽管有参照完整性),为实现动态约束以及多个元组之间的完整性约束,就需要触发器技术Trigger
* Trigger是一种过程完整性约束(相比之下,Create Table中定义的都是非过程性约束),是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行。
* 基本语法
```sql
CREATE TRIGGER trigger_name BEFORE | AFTER
{ INSERT | DELETE | UPDATE [OF colname {, colname...}] }
ON tablename
[REFERENCING corr_name_def {, corr_name_def...}] // 引用的变量
[FOR EACH ROW | FOR EACH STATEMENT] // 对更新操作的每一条结果(前者),或整个更新操作完成(后者)
[WHEN(search_condition)] // 检查条件,如满足执行下述程序
{ statement // 单行程序直接书写,多行程序要用下行方式
| BEGIN ATOMICstatement; { statement;...} END}
```
* 意义:当某一事件发生时(Before|After),对该事件产生的结果(或是每一元组,或是整个操作的所有元组),,检查条件search_condition,,如果满足条件,则执行后面的程序段。
* corr_name_def的定义
```sql
{ OLD [ROW] [AS] old_row_corr_name //更新前的旧元组命别名为
| NEW [ROW] [AS] new_row_corr_name //更新后的新元组命别名为
| OLD TABLE [AS] old_table_corr_name //更新前的旧Table命别名为
| NEW TABLE [AS] new_table_corr_name //更新后的新Table命别名为
}
```
* 示例
* 设计一个触发器当进行Teacher表更新元组时, 使其工资只能升不能降
```sql
create trigger teacher_chgsal before update of salary
on teacher referencing new x, old y
for each row when(x.salary < y.salary)
begin
raise_application_error(-20003, 'invalid salary on update'); //此条语句为Oracle的错误处理函数
end;
```
* 假设student(S#, Sname, SumCourse), SumCourse为该同学已学习课程的门数,初始值为0,以后每选修一门都要对其增1
```sql
create trigger sumc after insert
on sc referencing new row newi
for each row
begin
update student set SumCourse = SumCourse + 1 whereS# = :newi.S# ;
end;
```
* 假设student(S#, Sname, SumCourse), 当删除某一同学S#时,该同学的所有选课也都要删除
```sql
create trigger delS# after delete
on Student referencing old oldi
for each row
begin
deletescwhere S# = :oldi.S#;
end;
```
* 假设Dept(D#, Dname, Dean), 而 Dean一定是该系教师Teacher(T#, Tname, D#, Salary)中工资最高的教师
```sql
create trigger upddean before update of Dean
on Dept referencing old oldi, new newi
for each row when ( dean not in (select Tname from Teacher
where D# = :newi.D#
and salary>=all (select salary from Teacher where D# =:newi.D#))
begin
raise_application_error(-20003, 'invalid Dean on update');
end;
```
#### 安全性
数据库安全性是指DBMS应该保证的数据库的一种特性(机制或手段):免受非法、非授权用户的使用、泄漏、更改或破坏
DBMS的安全机制
* 自主安全性机制:存取控制(AccessControl)
* 通过权限在用户之间的传递,使用户自主管理数据库安全性
* 强制安全性机制:
* 通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据
* 推断控制机制:
* 防止通过历史信息,推断出不该被其知道的信息;
* 防止通过公开信息(通常是一些聚集信息)推断出私密信息(个体信息),通常在一些由个体数据构成的公共数据库中此问题尤为重要
* 数据加密存储机制:
* 通过加密、解密保护数据,密钥、加密/解密方法与传输
#### 自主安全实现
通常情况下,自主安全性是通过授权机制来实现的。
* 用户在使用数据库前必须由DBA处获得一个账户,并由DBA授予该账户一定的权限,该账户的用户依据其所拥有的权限对数据库进行操作; 同时,该帐户用户也可将其所拥有的权利转授给其他的用户(账户),由此实现权限在用户之间的传播和控制。
* 授权者:决定用户权利的人
* 授权:授予用户访问的权利
定义
* DBMS将权利和用户(账户)结合在一起,形成一个访问规则表,依据该规则表可以实现对数据库的安全性控制
* AccessRule ::= ( S, O, t, P)
* S: 请求主体(用户)
* O: 访问对象
* t: 访问权利
* P: 谓词
* {AccessRule}通常存放在数据字典或称系统目录中,构成了所有用户对DB的访问权利;
* 用户多时,可以按用户组建立访问规则
* 访问对象可大可小(目标粒度Object granularity):属性/字段、记录/元组、关系、数据库
* 权利:包括创建、增、删、改、查等
* 谓词:拥有权利需满足的条件
用户层面可用实现方式(视图)
* 视图
* 视图是安全性控制的重要手段,通过视图可以限制用户对关系中某些数据项的存取。
数据库层面(DCL)
* 数据库安全性控制是属于DCL范畴,维护了
* 授权命令
```SQL
GRANT{all PRIVILEGES | privilege {,privilege...}}
ON [TABLE] tablename| viewname
TO{public | user-id {, user-id...}}
[WITH GRANT OPTION]
```
* user-id,某一个用户账户,由DBA创建的合法账户
* privilege权利:SELECT | INSERT | UPDATE | DELETE | ALL PRIVILEDGES
* public, 允许所有有效用户使用授予的权利
* WITH GRANT OPTION选项是允许被授权者传播这些权利
* 授予视图访问的权利,并不意味着授予基本表访问的权利(两个级别:基本关系级别和视图级别)
* 授权者授予的权利必须是授权者已经拥有的权利
* 示例
```
Grant All PriviledgesON Employee TO Emp2001;
Grant SELECT,INSERT ON EmpV2 TO Emp5001 ;
Grant SELECT ON EmpV3 TO public;
Grant SELECT ON EmpV4 TO Emp0021;
```
* 收回授权命令
```SQL
REVOKE{all privilEges | priv {, priv...} } ON tablename| viewname
FROM{public | user {, user...} };
```
示例
```
revoke selecton employee from UserB
```
#### 强制安全性实现
强制安全性通过对数据对象进行安全性分级:绝密(Top Secret), 机密(Secret),可信(Confidential)和无分类(Unclassified)
* 同时对用户也进行上述的安全性分级
* 从而强制实现不同级别用户访问不同级别数据的一种机制
* 访问规则
* 用户S, 不能读取数据对象O, 除非Level(S)>=Level(O)
* 用户S, 不能写数据对象, 除非Level(S)<=Level(O)。
对数据安全级别分级实现
* 通过扩展关系模式来实现
* 关系模式: R(A1: D1, A2: D2, ..., An:Dn)
* 对属性和元组引入安全性分级特性或称分类特性R(A1: D1, C1, A2: D2, C2..., An:Dn, Cn, TC)
* 其中C1,C2,...,Cn分别为属性、D1,D2,...,Dn的安全分类特性
* TC为元组的分类特性
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201127000307245.png#pic_center)