数据字典和SQlDA
解决问题:动态SQL,依据条件动态构造SQL语句,但不知道欲访问的表名和字段名
1.数据字典(系统目录)
(1)数据字典是系统维护的一些表或视图的集合,这些表或视图存储了数据库中各类对象的定义信息,这些对象包括用Create语句定义的表,列,索引,视图,权限,约束等,这些信息又称数据库的元数据--关于数据的数据
(2)不同的DBMS对数据字典的称呼不同:数据字典,目录表,系统目录,系统视图
(3)不同的DBMS对系统目录的存储方式不同,有一些信息对DBA公开,利用这些公开信息,DBA可以使用一些特殊的SQL命令来检索
2.数据字典的内容构成
(1)数据字典通常存储的是数据库和表的元数据,即模式本身的信息
//应用程序员构造动态SQL需要的信息
(2)与关系相关的信息
1)关系名字
2)每一个关系的属性名及其类型
3)视图的名字及其定义
4)完整性约束
(3)用户和账户信息,包括密码
//数据库管理系统实现算法需要的信息
(4)统计与描述性数据:如每个关系中的元组数目
(5)物理文件组织信息
1)关系是如何存储的(顺序,无需,散列)
2)关系的物理位置
(6)索引相关的信息
3.数据字典的结构
(1)数据字典是存储在磁盘上的关系,专为内存高效访问设计的特定的数据结构
(2)可能的数据字典结构
1)Relation_metadata = (relation_name, number_of_attributes, storage_organization, location)
2)Attribute_metadata = (attribute_name, relation_name, domain_type, position, length)
//属性的元数据,属性名,属于那个关系,属性的域的类型,关系中的类型,长度
3)User_metadata = (user_name, encrypted_password, group)
//用户的元数据,用户名,密码,属于哪个组
4)Index_metadata = (index_name, relation_name, index_type, index_attributes)
5)View_metadata = (view_name, definition)
//视图的元数据,视图名,视图定义
4.X/Open标准的系统目录
(1)X/Open标准中有一个目录表Info_Schem.Tables该表中的一行是一个已经定义的表的有关信息
1)Table_Schem:表的模式名(通常是表所有者的用户名)
2)Table_Name:表名
3)Table_Type:“Base_Table”或“View”
(2)模式:指某一用户设计和使用的表,索引及其他与数据库有关的对象的集合,因此表的完整名:模式名.表名。这样做可允许不同用户使用相同的表名,而不混淆
(3)一般而言,一个用户有一个模式,可以使用 Create Schema 语句来创建模式,在 Create Table 等语句可以使用所定义的模式名称
(4)可以使用SQL语句来检索访问表中的信息
Select Table_Name From Tables;
5.Oracle的数据字典
(1)Oracle数据字典由视图组成,分为三种不同形式,由不同的前缀标识
1)USER_ :用户视图,用户所拥有的对象,在用户模式中
2)ALL_ :扩展的用户视图,用户可访问的视图
3)DBA_:DBA视图(所有用户都可访问的DAB对象的子集)
(2)Oracle数据字典定义了三个视图(可以用来了解相关表的信息:表的拥有者(模式),表名,其他信息)
1)USER_Tables
2)ALL_Tables
3)DBA_Tables
(3)Oracle数据字典也定义了三个视图(用来了解相关表的列的信息:表的拥有者,表名,列名,列的数据类型,数据长度,其他信息)
1)USER_TAB_Columns
2)ALL_TAB_Columns
3)DBA_TAB_Columns
(4)Oracle还定义了一些其他视图。。。
(5)SQL语句访问表的信息
Select Column_Name From ALL_TAB_Columns Where Table_Name = 'STUDENT'; //检索Student表中有哪些列
6.SQLDA
(1)构造复杂动态SQL需要数据字典和SQLDA
(2)SQLDA
1)SQLDA:SQL Descriptor Area,SQL描述符区域
2)SQLDA是一个内存数据结构,内可装载关系模式的定义信息,如列的数据,每一列的名字和类型等等
3)不同DBMS提供的SQLDA模式并不一致,通过查询DBMS的手册可以更详细的理解