数据库系统原理(四)

4.1 SQL语言与数据库完整性和安全性

4.1.1数据库完整性的概念及分类

1.什么是数据库完整性?

数据库完整性: 是指DBMS应保证的DB的一种特性-在任何情况下的正确性,有效性和一致性。
广义完整性: 语义完整性,并发控制,安全控制,DB故障恢复等
狭义完整性:专指语义完整性,DBMS通常有专门的完整性管理机制与程序来处理语义完整性问题

关系模型中有完整性要求:实体完整性,参照完整性,用户自定义完整性。
数据库设计中,在E-R图/IDF1X图中有很多的完整性约束条件,如何施加到数据库的定义中,如何起作用呢?

2.为什么会产生完整性问题?

  • 不正当的数据库操作,(输入错误,操作失误,程序处理失误)

数据库完整性管理的作用:
防止和避免数据库中不合理数据的出现;DBMS应尽可能地自动防止DB中语义不合理现象;

3.怎样保证数据库完整性?

  • DBMS允许用户定义一些完整性约束规则(用SQL-DDL来定义)
  • 当有DB更新操作时,DBMS自动按照完整性约束条件进行检查,以确保更新操作符合语义完整性。

在执行操作前需先通过完整性控制程序(依照完整性规则【DBA定义】,检查更新是否符合规则,进而决定是否允许更新),如果通过检查,则执行指令,否则阻挡指令。

完整性约束条件(完整性约束规则)的一般形式:
Integrity Constraint = (O,P,A,R)
O: 数据集合—(约束的对象?)列,多列,元组集合
P:谓词条件—什么样的约束?
A:触发条件—什么时候检查?
R:相应动作—不满足时怎么办?

4.数据库完整性的分类
按约束对象分类------
域完整性约束条件: 施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的。
关系完整性约束条件: 施加于关系/table上,对给定table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断。

按约束来源分类------
结构约束: 来自于模型的约束,例如函数依赖约束,主键约束(实体完整性),外键约束(参照完整性),只关心数值相等于否,是否允许空值等;
内容约束: 来自于用户的约束,如用户自定义完整性,关心元组或属性的取值范围。例如某属性值

按约束状态分类-----
静态约束: 要求DB在任一时候均应满足的约束;
动态约束: 要求DB从一状态变为另一状态时应满足的约束;

4.1.2 利用SQL语言实现数据库的静态完整性

1.SQL语言支持的约束类别
静态约束:列完整性—域完整性约束;表完整性—关系完整性约束
动态约束:触发器

2.SQL语言实现约束的方法-Create Table
Create Table有三种功能:定义关系模式,定义完整性约束和定义物理存储特性
定义完整性约束条件:列完整性,表完整性;

在这里插入图片描述

Col_constr列约束: 一种域约束类型,对单一列的值进行约束

{ NOT NULL |					//列值非空
	[CONSTRAINT constraintname]  //为约束命名,便于以后撤销
		{ UNIQUE  					//列值是唯一
		|PRIMARY KEY  				//列为主键
		|CHECK (search_cond)  		//列值满足条件,条件只能使用列当前值
		|REFERENCES  tablename [(colname)]   //列为外键,后带另一为主键的表名
			[ON DELETE{CASCADE|SET NULL}] } }
	//在另一表中,涉及到这个列值的行应被删除

示例:

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));
		//Ssex只能为男或女,年龄在1到150之间,D#为外键

**table_constr表约束: ** 一种关系约束类型,对多列或元组的值进行约束

[CONSTRAINT constraintname]			//为约束命名,便于以后撤销
	{UNIQUE (colname{,colname...})   //几列值组合在一起是唯一
	|PRIMARY KEY (colname{,colname...})  //几列联合为主键
	|CHECK(search_condition)    	//元组多列值共同满足条件
								//条件中只能使用同一元组的不同列列当前值
	|FOREIGN KEY(colname{,colname...})
		REFERENCES tablename[(colname{,colname...})]
		[ON DELETE CASCADE]}
						//引用另一表tablename的若干列的值作为外键

—check中的条件可以是Select-From-Where内任何Where子查询
—Create Table中定义的表约束或列约束可以在以后根据需要进行撤销或追加约束,语句为Alter Table(不同系统可能有差异)
在这里插入图片描述

示例:撤销SC表的ctscore约束

Alter Table SC
		DROP CONSTRAINT ctscore;

示例:再对SC表的score进行约束,使其分数再0~150之间

Alter Table SC
		Modify (Score float(1) constraint nctscore check (Score>=0.0 and Score <= 150.0));

—有些DBMS支持独立的追加约束,注意书写格式可能有些差异

3.SQL语言实现约束的方法-断言
断言ASSERTION:
——一个断言就是一个谓词表达式,它表达了希望数据库总能满足的条件;
——表约束和列约束就是一些特殊的断言
——SQL还提供了复杂条件表达的断言。其语法形式为:
CREATE ASSERTION < assertion-name > CHECK < predicate >
——当一个断言创建后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言。
——断言测试增加了数据库维护的负担,要小心使用复杂的断言

在这里插入图片描述

4.1.3 利用SQL语言实现数据库的动态完整性

实现数据库动态完整的方法——触发器Trigger
触发器Trigger: Create Table中表约束和列约束基本上都是静态的约束,也基本上都是对单一列或单一元组的约束,为实现动态约束以及多个元组之间的完整性约束,就需要触发器技术Trigger
——Trigger是一种过程完整性约束(相比之下,Create table中定义的都是非过程性约束),是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行。

在这里插入图片描述
Trigger意义:当某一事件发生时,对该事件产生的结果(每一元组或是整个操作的所有元组),检查条件search_condition,如果满足条件,则执行后面的程序段。条件或程序段中引用的变量可用corr_name_def来限定。

事件: BEFORE | AFTER { INSERT | DELETE | UPDA}
当一个事件发生之前或发生之后触发;
操作发生,执行触发器操作需处理元组值

—corr_name_def的定义:

{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命别名为
}

—corr_name_def将在检测条件或后面的动作程序段中被引用处理

示例一:设计一个触发器当进行Teacher表更新元组时,使其工资只能升不能降。

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.设计一个触发器自动完成以上功能。

create trigger sumc after insert on sc
	referencing new row newi
	for each row
		begin
			update student set SumCourse = SumCourse + 1
			where S# =: newi.S#;
		end;

4.1.4 数据库安全性的概念及分类

数据库安全性: 是指DBMS应该保证的数据库的一种特性(机制或手段):免受非法,非授权用户的使用,泄露,更改或破坏。
数据的安全级别: 绝密,机密,可信和无分类
数据库系统DBS的安全级别:物理控制,网络控制,操作系统控制,DBMS控制。

DBMS的安全机制:
1.自主安全性机制:存取控制-通过权限在用户之间的传递,使用户自主管理数据库安全性
2.强制安全性机制:通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据
3.推断控制机制:防止通过历史信息,推断出不该被其知道的信息;防止通过公开的信息推断出私密信息。
4.数据加密存储机制:通过加密,解密保护数据,密钥。

4.1.5 数据库自主安全性机制

通常情况下,自主安全性是通过授权机制来实现的。
用户在使用数据库前必须有DBA处获得一个账户,并由DBA授予该账户一定的权限,该账户的用户依据其所拥有的权限对数据库进行操作;同时,该账户用户也可将其所拥有的权利转授给其他用户(账户),由此实现权限在用户之间的传播和控制。
授权者:决定用户权利的人
授权:授予用户访问的权利。

1.DBMS怎样实现数据库自主安全性?
DBMS允许用户定义一些安全性控制规则(SQL-DCL)
当有DB访问操作时,DBMS自动按照安全性控制规则进行检查,检查通过则允许访问,不通过则不允许访问。

2.数据库自主安全性访问规则
DBMS将权利和账户结合在一起,形成一个访问规则表,根据这个表可以实现对数据库的安全性控制
AccessRule ::=(S,O,t,P)
S:请求主体(用户)
O:访问对象
t:访问权利
P:谓词

{AccessRule}通常存放在数据字典或系统目录中,构成了所有用户对DB的访问权利;
用户多时,可以按用户组建立访问规则
访问对象可大可小:属性/字段,记录/元组,关系,数据库
权利:包括创建,增,删,改,查等
谓词:拥有权利需满足的条件

3.一个自主安全性控制的例子

员工管理数据库的安全性控制示例:
Employee(P#,Pname,Page,Psex,Psalary,D#,HEAD)
有如下的安全性访问要求:

员工管理人员:能访问该数据库的所有内容,便于维护员工信息
收发人员:访问该数据库以确认某员工是哪一部门的,便于收发工作,只能访问基本信息,其他信息不允许访问
每个员工:允许其访问关于自己的记录,以便查询自己的工资情况,但不能修改
部门领导:能够查询其所领导部门人员的所有情况。
高级领导:能够访问该数据库的所有内容,但只能读。

两种控制示例:
1.按名控制安全性:存储矩阵
2.按内容控制安全性:

4.1.6 利用SQL语言实现数据库自主安全性

1.SQL语言的用户与权利
SQL语言包括了DDL,DML和DCL。数据库安全性控制是属于DCL范畴
授权机制—自主安全性;视图的运用
关系级别(普通用户)–账户级别(程序员用户)—超级用户(DBA)

  • 级别1-Select:读
  • 级别2-Modify:更新——Insert,Update,Delete
  • 级别3-Create:创建——Create,Alter,Drop

级别高的权利自动包含级别低的权利。
2.SQL-DCL的命令及其应用
授权命令:

GRANT {all PRIVILEGES | pririlege{,privilege...}}
	ON [TABLE]tablename|viewname
	TO {public | user-id{user-id...}}
	[WITH GRANT OPTION];

user-id:某一个用户账户,由DBA创建的合法账户
public:允许所有有效用户使用授予的权利
privilege是以下权利:SELECT|INSERT|UPDATE|DELETE|ALL PRIVILEDGES
WITH GRANT OPTION选项是允许被授权者传播这些权利

收回授权命令:

 REVOKE {all privilege | priv{,priv...}} ON tablename | viewname
 	FROM {public |user{,user...}};

4.1.7 安全型控制的其他简介

1.自主安全性的授权过程及其问题
授权过程:
第一步:DBA创建DB,并为每一个用户创建一个账户
假定建立了五个用户:UserA,UserB,UserC,UserD,UserE
第二步:DBA授予某用户账户级别的权利
假定授予UserA
第三步:具有账户级别的用户可以创建基本表或视图,他也自动称为该表或该视图的属主账户,拥有该表或该视图的所有访问权利
假定UserA创建了Employee,则UserA就是Employee表的属主账户
第四步:拥有属主账户的用户可以将其中一部分权利授予另外的用户,该用户也可将权利进一步授权给其他用户
假定UserA将读权限授予UserB,UserB又将其拥有的权限授予UserC,如此将权利不断地传递下去

注意授权的传播范围:传播范围包括两个方面:水平传播数量和垂直传播数量
水平传播数量是授权者的再授权用户数目(树的广度)
垂直传播数量是授权者传播给被授权者,再被传播给另一个被授权者。。。(树的深度)

当一个用户的权利被收回时,通过其传播给其他用户的权利也将被收回
如果一个用户从多个用户处获得了授权,则当其中某一个用户收回授权时,该用户可能仍保有权利。

2.强制安全性
强制安全性机制: 强制安全性通过对数据对象进行安全性分级:
——绝密;机密;可信;无分类
——同时对用户也进行上述的安全性分级
——从而强制实现不同级别用户访问不同级别数据的一种机制

强制安全性机制的实现:DBMS引入强制安全性机制,可以通过扩展关系模式来实现
关系模式:R(A1:D1, A2:D2,…,An:Dn)
对属性和元组引入安全性分级特性或分类特性:
R(A1:D1,C1,A2:D2,C2,…,An:Dn,Cn,TC)——其中C为属性D的安全分类特性;TC为元组的分类特性。

4.2 嵌入式SQL语言

4.2.1 嵌入式SQL语言的概述

1.交互式SQL语言的局限
优点:记录集合操作,非过程性操作,一条语句实现复杂查询结果
缺点:
从使用者角度——专业人员可熟练写出SQL语句,但大部分普通用户不可以
从SQL本身角度——特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序,分支和循环结构来帮忙处理

因此——高级语言+SQL语言
——既继承了高级语言的过程控制性
——又结合了SQL语言的复杂结果集操作的非过程性
——同时为数据库操作者提供安全可靠的操作方式:通过应用程序进行操作

2.嵌入式SQL语言:将SQL语言嵌入到某一种高级语言中使用,又称宿主语言
嵌入到宿主语言中的

3.嵌入式SQL语言与交互式SQL语言的对比
示例——
交互式SQL语言:select Sname,Sage from Student where Sname = ‘张三’ ;
嵌入式SQL语言(c语言):
exec sql select Sname,Sage into :vSname,:vSage from Student where Sname=‘张三’;
典型特性:
——exec sql 引导SQL语句:提供给c编译器,以便对SQL语句预编译成c编译器可识别的语句
——增加一into语句:该子句用于指出接受SQL语句检索结果的程序变量
——由冒号引导的程序变量,如‘:vSname’,‘:vSage’

4.高级语言中使用嵌入式SQL语言需要解决的问题
Q1:如何与数据库连接和断开连接
Q2:如何将宿主程序的变量传递给SQL语句
Q3:SQL语句如何执行
Q4:如何将SQL检索到的结果传递回宿主程序进行处理
Q5:静态SQL,SQL语句中的常量更换为变量
Q6:宿主程序如何知道SQL语句的执行状态,是否发生错误
Q7:动态SQL,依据条件动态构造SQL语句,但欲访问的表名和字段名对编程者是已知的。
Q8:动态SQL,依据条件动态构造SQL语句,但欲访问的表名和字段名对编程者是未知的。

4.2.2 变量声明与数据库连接

变量的声明与使用:

//在嵌入式SQL语句中可以出现宿主语言语句所使用的变量:
exec sql select Sname,Sage into :vSname,:vSage from Student 
where Sname= :specName;

这些变量需要特殊的声明:

exec sql begin declare section;
	char vSname[10],specName[10]="张三";
	int vSage;
exec sql end declare section;

变量的声明和赋值中,要注意:

  • 宿主程序的字符串变量长度应比字符型字段的长度多1个。因宿主程序的字符串尾部多一个终止符’\0’,而程序中用双引号来描述。
  • 宿主程序变量类型与数据库字段类型之间有些是有差异的,有些DBMS可支持自动转换,有些不能。
  • 声明的变量,可以在宿主程序中赋值,然后传递给SQL语句,以使SQL语句能够按照指定的要求进行检索。

程序与数据库的连接与断开

  • 在嵌入式SQL程序执行之前,首先要与数据库进行连接
  • 不同DBMS,具体连接语句的语法略有差异
  • SQL标准中建议的连接语法为:
exec sql connect to target-server as connect-name user user-name;
//或者
exec sql sonnect to default;
  • 在嵌入式SQL程序执行之后,需要与数据库断开连接
  • SQL标准中建议的断开连接的语法为:
exec sql disconnect connect-name;
//或
exec sql disconnect current;

SQL执行的提交与撤销:

  • SQL语句在执行过程中,必须有提交或撤销语句才能确认其操作结果
  • SQL执行的提交:
	exec sql commit work;
  • SQL执行的撤销:
exec sql rollback work;

事务: (程序员角度)是一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务。

  • 事务一般是由应用程序员提出,因此有开始和结束,结束前需要提交或者撤销
Begin Transaction
	exec sql..
	...
	exec sql commint work | exec sql rollback work
End Transaction
  • 在嵌入式SQL程序中,任何一条数据库操纵语句都会引发一个新事务的开始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过commit或rollback确认的。因此begin和end两行语句是不需要的。

事务: (微观角度,DBMS角度) :是数据库管理系统提供的一种数据库操纵手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。

事务的特性:ACID

  • 原子性Atomicity:DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做。
  • 一致性Consistency:DBMS保证事务的操作状态是正确的,符合一致性的操作规则,它是进一步由隔离性来保证的
  • 隔离性Isolation:DBMS保证并发执行的多个事务之间互相不受影响。
  • 持久性Durability:DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。

4.2.3 数据集与游标

1.如何读取单行数据和多行数据

单行结果处理与多行结果处理的差异(INTO子句与游标)——
—检索单行结果,可将结果直接传送到宿主程序的变量中
—检索多行结果,则需要使用游标(Cursor)

  • 游标是指向某检索记录集的指针;
  • 通过这个指针的移动,每次读一行,处理一行,在读一行…,直至处理完毕
  • 读一行操作是通过Fetch…into语句实现的:每一次Fetch,都是先向下移动指针,然后再读取。
  • 记录集结束表示EOF,用来标记后面已没有记录了

2.游标的使用概览

游标的使用需要先定义,再打开,接着一条一条处理,最后再关闭

exec sql declare cur_student cursor for
select Sno,Sname,Sclass from Student where Sclass='035101';
exec sql open cur_studnent;
exec sql fetch cur_student into :vSno,:vSname,:vSclass;
... ...
exec sql close cur_student;
  • 游标可以定义一次,多次打开,多次关闭
  • Cursor的打开与关闭:open cursor//close cursor
  •  	EXEC SQL OPEN cursor_name;
    
  •  	EXEC SQL CLOSE cursor_name;
    
  • Cursor 的数据读取:Fetch
  •  	EXEC SQL FETCH cursor_name
    
  •  			INTO host-variable,[host-variable,...];
    

4.2.4 可滚动游标及数据库的增删改查

1.可滚动游标的概念
ODBC支持的可滚动的Cursor
——标准的游标始终是自开始向结束方向移动的,每fetch一次,向结束方向移动一次;一条记录只能被访问一次;在访问该记录只能关闭游标后重新打开。
——ODBC是一种跨DBMS的DB操作平台,它在应用程序与实际的DBMS之间提供了一种通用接口。
——许多实际的DBMS并不支持可滚动游标,但通过ODBC可以使用该功能。

2.可滚动游标的定义与使用
可滚动游标是可使游标指针在记录集之间灵活滚动,使每一记录都可访问的一种游标。

EXEC SQL DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
	[WITH HOLD] FOR Subquery
	[ORDER BY result_column [ASC | DESC][,result_column...]]
	[FOR READ ONLY | FOR UPDATE OF columnname[.
	columnname]...];
EXEC SQL FETCH
	[NEXT|PRIOR|FIRST|LAST
	|[ABSOLUTE|RELATIVE] value_spec]
	FROM cursor_name INTO host_variable[,host-variable...];
  • NEXT向结束方向移动一条;PRIOR向开始方向移动一条;FIRST回到第一条;LAST移动到最后一条;ABSOLUT value_spec定向检索指定位置的行,value_spec由1至当前记录集最大值;RELATIVE value_spec相对当前记录向前或向后移动,value_spec为正数向结束方向移动,为负数向开始方向移动。
  • 可滚动游标移动时需判断是否到结束位置,或到起始位置
    可通过判断是否到EOF位置(最后一条记录的后面),或BOF位置(起始记录的前面)
    如果不需区分,可通过whenever not found语句设置来检测

3.数据的删除与更新
数据库记录的删除:一种是查找删除(与交互式DELETE语句相同),一种是定位删除

	EXEC SQL DELETE FROM tablename [corr_name]
		WHERE search_condition | WHERE CURRENT OF cursor_name;

数据库记录的更新:一种是查找更新(与交互式Ipdate语句相同),一种是定位更新

	EXEC SQL UPDATE tablename [corr_name]
		SET columnname = expr[,columnname = expr...]
		WHERE search_condition | WHERE CURRENT OF cursor_name;

数据库记录的插入:只有一种类型的插入语句

	EXEC SQL INSERT INTO tablename [(columnname[columnname,...])]
		[VALUES(expr[,expr,..])|subqurey];

4.2.5 状态捕获及错误处理机制

状态是嵌入式SQL语句的执行状态,尤其是一些出错的状态;
嵌入式SQL程序中,状态捕获及处理由三部分构成:

  • 设置SQL通信区:一般在嵌入式SQL程序的开始便处理
  •  	exec sql include sqlca;
    
  • 设置状态捕获语句:在嵌入式SQL程序的任何位置都可设置;可多次设置;但有作用域
  •  exec sql whenever sqlerror goto report_error;
    
  • 状态处理语句:某一段程序以应对SQL操作的某种状态:
  •  report_error: exec sql rollback;
    

SQL通信区:SQLCA

  • SQLCA是一个已被声明过的具有c语言的结构形式的内存信息区,其中的成员变量用户来记录SQL语句执行的状态,便于宿主程序读取与处理。
  • SQLCA是DBMS与宿主程序之间交流的桥梁之一。

状态捕获语句:

  •   exec sql whenever condition action;
    

whenever语句的作用是设置一个“条件陷阱”,该条语句会对其后面的所有由exec sql语句引起的对数据库系统的调用自动检查它是否满足条件

  • SQLERROR: 检测是否有SQL语句出错
  • NOT FOUND:执行某一SQL语句后,没有相应的结果记录出现。
  • SQLWARNING:不是错误,但应引起注意的条件

如果满足condition,则要采取一些动作:

  • CONTINUE:忽略条件或错误,继续执行
  • GOTO 标号:转移到标号所指示的语句,去进行相应的处理。
  • STOP:终止程序运行,撤销当前的工作,断开数据库的连接
  • DO函数或CALL函数:调用宿主程序的函数进行处理,函数返回后从引发该条件的EXEC sql语句之后的语句继续进行。

状态捕获语句whenever的作用范围使其后的所有语句,知道出现相同条件的whenever语句为止,后面的将覆盖前面的。
状态捕获语句whenever的使用容易引发无限循环

状态信息:
典型DBMS系统记录状态信息的三种方法:
状态记录——sqlcode:典型DBMS都提供一个sqlcode变量来记录其执行的sql语句的状态,但不同DBMS定义的sqlcode值所代表的状态意义可能不相同

4.3 嵌入式SQL语言之动态SQL

4.3.1 动态SQL的概念和作用

静态SQL特点: SQL语句在程序中已经按要求写好,只需要把一些参数通过变量传送给嵌入式SQL语句即可
动态SQL特点: SQL语句可以在程序中动态构造,形成一个字符串

如何设计用户的操作界面?
——界面操作表单型语言->QBE->SQL->关系代数

4.3.2 动态SQL语句的执行方式

两种执行方式:
1.立即执行语句:运行时编译并执行
2.Prepare-Execute-Using语句:PREPARE语句先编译,编译后的SQL语句允许动态参数,EXECUTE语句执行,用USING语句将动态参数值传送给编译好的SQL语句。

4.3.3 数据字典与SQLDA

数据字典:又称为系统目录,是系统维护的一些表或视图的集合,这些表或视图存储了数据库中各类对象的定义信息,这些对象包括用Create语句定义的表,列,索引,视图,权限,约束等,这些信息又称为数据库的元数据-关于数据的数据

数据字典的内容构成: 数据字典通常存储的是数据库和表的元数据,即模式本身的信息。

  • 与关系相关的信息:关系名字;每一个关系的属性名及其类型;视图的名字及其定义;完整性约束;
  • 用户与账户信息,包括密码
  • 统计与描述性数据
  • 物理文件组织信息
  • 索引相关的信息

数据字典的表结构或视图:
数据字典的结构:也是存储在磁盘上的关系;专为内存高效访问设计的特定的数据结构
可能的字典数据结构:
Relation_metadata = (relation_name, number_of_attributes,storage_organization,location)

模式的含义是指某一用户所设计和使用的表,索引及其他与数据库有关的对象的集合,因此表的完整名应是:模式名.表名。这样做可允许不同用户使用相同的表名,而不混淆。
一般一个用户有一个模式。可以使用Create Schema语句来创建模式,

SQLDA: 是一个内存数据结构,内可装载关系模式的定义信息,如列的数目。通过读取SQLDA信息可以进行更为复杂的动态SQL的处理。

4.3.4 ODBC

1.什么是ODBC?
ODBC: 是一种标准,不同语言的应用程序与不同数据库服务器之间通讯的标准。
——一组API(应用程序接口),支持应用程序与数据库服务器的交互
应用程序通过调用ODBC API,实现:与数据库服务器的连接,向数据库服务器发送SQL命令,一条一条的提取数据库检索结果中的元组传递给应用程序的变量。

4.3.5 JDBC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值