Schema
Schema是用于描述和规范XML文档的逻辑结构的一种语言,它最大的作用就是验证XML文件逻辑结构的正确性。可以理解成与DTD(文档类型定义)功能差不多,但是Schema在当前的WEB开发环境下优越很多。因为它本身就是一个有效的XML文档,因而可以更直观地了解XML的结构。除此之外,Schema支持命名空间,内置多种简单和复杂的数据类型,并支持自定义数据类型。由于存在这么多的优点,所以Schema渐渐成为XML应用的统一规范。
1、XMLSchemaXSD元素
元素解释
all规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。
annotationannotation元素是一个顶层元素,规定schema的注释。
any使创作者可以通过未被schema规定的元素来扩展XML文档。
anyAttribute使创作者可以通过未被schema规定的属性来扩展XML文档。
appInfo规定annotation元素中应用程序要使用的信息。
attribute定义一个属性。
attributeGroup定义在复杂类型定义中使用的属性组。
choice仅允许在
complexContent定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
complexType定义复杂类型。
documentation定义schema中的文本注释。
element定义元素。
extension扩展已有的simpleType或complexType元素。
field规定XPath表达式,该表达式规定用于定义标识约束的值。
group定义在复杂类型定义中使用的元素组。
import向一个文档添加带有不同目标命名空间的多个schema。
include向一个文档添加带有相同目标命名空间的多个schema。
key指定属性或元素值(或一组值)必须是指定范围内的键。
keyref规定属性或元素值(或一组值)对应指定的key或unique元素的值。
list把简单类型定义为指定数据类型的值的一个列表。
notation描述XML文档中非XML数据的格式。
redefine重新定义从外部架构文件中获取的简单和复杂类型、组和属性组。
restriction定义对simpleType、simpleContent或complexContent的约束。
schema定义schema的根元素。
selector指定XPath表达式,该表达式为标识约束选择一组元素。
sequence要求子元素必须按顺序出现。每个子元素可出现0到任意次数。
simpleContent包含对complexType元素的扩展或限制且不包含任何元素。
simpleType定义一个简单类型,规定约束以及关于属性或仅含文本的元素的值的信息。
union定义多个simpleType定义的集合。
unique指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。
2、数据库中的Schema
官方定义如下:
Aschemaisacollectionofdatabaseobjects(usedbyauser.).
schemaobjectsarethelogicalstructuresthatdirectlyrefertothedatabase’sdata.
Auserisanamedefinedinthedatabasethatcanconnecttoandaccessobjects.
schemasandusershelpdatabaseadministratorsmanagedatabasesecurity.
从定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tablesviewssequencesstoredproceduressynonymsindexesclustersanddatabaselinks。
一个用户一般对应一个schema该用户的schema名等于用户名,并作为该用户缺省schema。这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(oracle中虽然有createschema语句,但是它并不是用来创建一个schema的),在创建一个用户的同时为这个用户创建一个与用户名同名的schema并作为该用户的缺省schema。即schema的个数同user的个数相同,而且schema名字同user名字一一对应并且相同,所有我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。
一个用户有一个缺省的schema,其schema名就等于用户名,当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过selectfromemp其实,这sql语句的完整写法为selectfromscott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。
sql>grantdbatoscott
sql>createtabletest(namechar(10))
tablecreated.
sql>createtablesystem.test(namechar(10))
tablecreated.
sql>insertintotestvalues('scott')
1rowcreated.
sql>insertintosystem.testvalues('system')
1rowcreated.
sql>commit
commitcomplete.
sql>connsystem/manager
connected.
sql>selectfromtest
name
----------
system
sql>altersessionsetcurrent_schema=scott--改变用户缺省schema名
sessionaltered.
sql>selectfromtest
name
----------
scott
sql>selectownertable_namefromdba_tableswheretable_name=upper('test')
ownertable_name
------------------------------------------------------------
scotttest
systemtest
--上面这个查询就是我说将schema作为user的别名的依据。实际上在使用上,shcema与user完全一样,没有什么区别,在出现schema名的地方也可以出现user名。
推荐阅读