菜鸟 发表于 2005-6-15 11:53:11

定义数据库对象

定义数据库对象
设置向后兼容等级

在基于缺省设置运行的情况下,Microsoft SQL Server 2000将针对某些自身行为方式不同于SQL Server早期版本标准的Transact-SQL语句采取SQL-92行为方式。SQL Server 2000还将采用SQL Server早期版本所不具备的某些预留关键字。在对配备当前应用的当前系统实施升级时,如果当前应用依赖于早期行为方式,您便可借助数据库兼容等级设置选项保持这些行为方式。而这就为您提供了以早期方式进行应用升级的宝贵时间。当然,大多数应用程序将不会受到行为方式改变的影响,并可在SQL Server 2000兼容等级上正常运行。

您可借助sp_dbcmptlevel系统存储过程为每个数据库指定兼容等级。数据库兼容等级可被设置为60(SQL Server 6.0版兼容性)、65(SQL Server 6.5兼容性)、70(SQL Server 7.0版兼容性)和80(SQL Server 2000兼容性——缺省设置)。不同兼容等级设置所产生的影响一般会受到同样存在于SQL Server早期版本中的少数Transact-SQL语句的限制。即便在数据库兼容等级被设定为60或65的情况下,应用程序也能获得SQL Server 2000最新性能改进所提供的几乎全部收益。应用程序仍将从诸如改进型查询处理器等特性中获益

重要提示:master 数据库的兼容等级固定为80,并且无法接受修改。如果您已将用户定义对象添加至master数据库,则必须确保这些对象在固定为80的兼容等级上正常发挥作用。

定义数据库对象

由于每个RDBMS都严格遵循支持对象定义的SQL-92标准,因此,Informix数据库对象(表、视图和索引)可被轻而易举地迁移至Microsoft SQL Server。将Informix SQL表、索引和视图定义转换成SQL Server表、索引和视图定义只需进行相当简单的语法调整。下表突出列示了Informix与Microsoft SQL Server在数据库对象方面存在的主要区别。

类别 Microsoft SQL Server Informix
列数
1024
2,767

行数
8060字节,另有16字节指向每个文本或图像列
32,767字节

最大行数
不限
不限(只要表容量保持在64 GB以内)

二进制大对象(Blob)型存储
按行存储的16位指针。基于其它数据页存储的数据
无法存储在表或二进制大对象空间内

群集化表索引
每表1个
每表1个(按索引组织的表)

非群集化表索引
每表249个
77个(假设表内存在一个范围,每个键只有一个组成部分)

单个索引中的最大列数
16
16

索引中的最大列值长度
900字节
255字节

表命名规则
[[database.]owner.]table_name
[owner.]table_name[@Server]

视图命名规则
[[database.]owner.]table_name
[owner.]table_name[@Server]

索引命名规则
[[database.]owner.]table_name
[owner.]table_name[@Server]


我们在此假定您从用以创建数据库对象的Informix SQL脚本或程序着手。只需复制相关脚本或程序,并进行下列修改。本节后续部分将就每项修改展开讨论。例证取自示例应用脚本Oratable.sql和Sstable.sql:

1.
确保数据库对象标识符遵守Microsoft SQL Server命名规则。您可能只需修改索引名称。

2.
考虑SQL Server数据库将会需要的数据存储参数。如果您正在使用RAID,则不需要任何存储参数。

3.
将Informix约束定义修改为可在SQL Server中工作的状态。如果表跨越多个数据库,则应使用触发器实现外键关系。

4.
修改CREATE INDEX语句,以便对群集化索引加以充分利用。

5.
使用数据转换服务新建CREATE TABLE语句。审核新建语句,并关注Informix数据类型对SQL Server数据类型的对应关系。

6.
删除一切SERIAL语句,并将序列数据类型替换为CREATE TABLE或ALTER TABLE语句中的标识列。

7.
在必要时修改CREATE VIEW语句。

8.
删除对同义字链的一切引用。

9.
评估Microsoft SQL Server临时表在应用程序中的使用情况和有效性。

10.
评估用户自定义规则、数据类型及缺省设置的潜在用途。


数据库对象标识符
下表将Informix与Microsoft SQL Server的对象标识符处理方式进行了对比。大多数情况下,您都不必在迁移至SQL Server时修改对象名。

Informix Microsoft SQL Server
标识符名称最长可达128字节。
长度为1-128个Unicode字符
长度为1-128个Unicode字符
临时表名称:最长可达116字符

标识符名称可以字母字符或下划线开始,并包含文字数字式字符、下划线(_)或美元符号($)。
标识符名称可以字母字符或下划线(_)开始,并包含任意字符。
如果标识符以空格开始或包含除_、@、#和$之外的文字数据字符,则必须用[ ](分隔符)将标识符名称括起来。
如果对象以@开始,则为本地变量。
如果对象以#开始,则为本地临时对象。
如果对象以##开始,则为全局临时对象。

数据库名称必须在Informix实例中具备唯一性(除在ANSI模式下为owner.database之外)
数据库名称必须具备唯一性。

标识符名称必须在用户账户(数据库)范围内具备唯一性。
标识符名称必须在数据库用户账户范围内具备唯一性。

列名必须在表和视图范围内具备唯一性。
列名必须在表和视图范围内具备唯一性。

索引名称必须在数据库范围内具备唯一性。
索引名称必须在数据库表名称范围内具备唯一性。


限定表名称
当您对存在于Informix用户账户中的表进行访问时,只需利用不受限制的名称即可将表选中。对其它Informix数据库中的表进行访问需要为表名冠以数据库名,并在两者之间用圆点(.)分隔。Informix的相似限定方法提供了更大的位置透明度。Informix还允许利用表所有者对表加以识别。

Microsoft SQL Server使用不同规则对表加以引用。由于SQL Server登录账户可在多个数据库中使用相同名称创建表,因此,下列规则可供用来对表和视图进行访问:[owner_name.]table_name

访问存在于…之中的表 Informix Microsoft SQL Server
用户账户
SELECT *
FROM STUDENT
SELECT * FROM USER_DB.STUDENT_ADMIN.STUDENT

其它架构
SELECT * FROM STUDENT_ADMIN.STUDENT
SELECT * FROM OTHER_DB.STUDENT_ADMIN.STUDENT


下面是有关Microsoft SQL Server表和视图的命名指导原则:

• 数据库名和用户名属于可选项。当只通过名称(例如,STUDENT)来引用表时,SQL Server将在当前数据库中的当前用户账户内查找相关表。如果SQL Server没有发现所需查找的表,就会在数据库中对由保留用户名dbo所拥有的同名对象进行查找。数据库中用户账户下的表名必须具有唯一性。

• 同一SQL Server登录账户可在多个数据库中拥有具备相同名称的表。例如,ENDUSER1账户拥有下列数据库对象:USER_DB.ENDUSER1.STUDENT和OTHER_DB.ENDUSER1.STUDENT。由于数据库名和SQL Server登录名不必完全一致,因此,限定符使用了数据库名,而非SQL Server登录名。

• 与此同时,这些数据库中的其它用户还可拥有下列同名对象:

• USER_DB.DBO.STUDENT

• USER_DB.DEPT_ADMIN.STUDENT

• USER_DB.STUDENT_ADMIN.STUDENT

• OTHER_DB.DBO.STUDENT



为此,我们建议将所有者名称作为数据库对象引用的组成部分。如果应用程序具有多个数据库,则建议将数据库名作为引用组成部分包含在内。如果查询涉及多个服务器,则应将服务器名称包含在内。

• 通往SQL Server的每个连接都具有在登录时通过USE语句设定的当前数据库上下文环境。让我们假设这样一个示例情境:

使用ENDUSER1账户的用户已登录到USER_DB数据库,并请求调用STUDENT表。SQL Server将查找名为ENDUSER1.STUDENT的表。如果该表能被找到,SQL Server将对USER_DB.ENDUSER1.STUDENT执行用户所请求的数据库操作。如果该表未被找到,SQL Server就会在数据库中的dbo账户下搜索USER_DB.DBO.STUDENT。如果该表仍未被发现,SQL Server则会返回一条出错信息,告知用户该表并不存在。

• 如果另一个用户(例如,DEPT_ADMIN)拥有该表,那么,表名称必须被冠以数据库用户名(DEPT_ADMIN.STUDENT);否则,数据库名将缺省引用处在当前数据库上下文环境中的数据库。

• 如果已被引用的表存在于另一个数据库中,则必须将该数据库名作为引用的组成部分。举例来说,如需对OTHERDB数据库中由ENDUSER1拥有的STUDENT表加以引用,则应使用OTHER_DB.ENDUSER1.STUDENT。


用户可通过两个连续的句点(..)达到忽略对象所有者的目的。例如,在某一应用程序引用STUDENT_DB..STUDENT的情况下,SQL Server就会搜索以下对象:

1.
STUDENT_DB.current_user.STUDENT

2.
STUDENT_DB.DBO.STUDENT


如果应用程序每次只使用单一数据库,那么,在对象引用中忽略数据库名称的做法将有助于降低以该应用程序调用另一数据库的复杂程度。所有对象引用均以隐含方式访问当前正被使用的数据库。当您需要基于同一服务器维护测试数据库与生产数据库时,这种处理方法将颇具实用价值。

生成表
由于Informix与SQL Server均可为SQL-92入门级RDBMS对象识别规则提供支持,因此,这两种系统的CREATE TABLE语法较为相似。

Informix
Microsoft SQL Server

CREATE TABLE
table_name
(
{col_name column_properties
[constraint [constraint
[...constraint]]]| [[,] constraint]}
[[,] {next_col_name | next_constraint}...]
)

CREATE TABLE table_name
(
{col_name column_properties[constraint
]]| [[,] constraint]}
[[,] {next_col_name | next_constraint}...]
)



Informix数据库对象名既可区分大小写,又可不区分大小写(设定DELIMIDENT环境变量,并用双引号将对象名括起来)。在Microsoft SQL Server中,可根据安装选项设置情况对数据库对象名区分大小写。

SQL Server最初安装时,缺省排序次序将采用字典顺序,并区分大小写。(您可使用SQL Server安装程序选取不同配置。)由于Informix对象名永远保持唯一,因此,您不应在将数据库对象迁移到SQL Server时遇到任何问题。我们建议,无论在Informix还是SQL Server中,均应对所有表名和列表采取小写形式,以防止用户在可区分大小写的SQL Server上执行安装操作时遇到问题。

表和索引存储参数
基于Microsoft SQL Server使用冗余磁盘阵列(RAID的做法通常有助于简化数据库对象的存放。SQL Server群集化索引可与表结构相集成,就如同按索引组织的Informix表一样。

Informix
Microsoft SQL Server

CREATE TABLE DEPT_ADMIN.DEPT (
DEPT VARCHAR(4) NOT NULL PRIMARY KEY CONSTRAINT DEPT_DEPT_PK,
DNAME VARCHAR(30) NOT NULL UNIQUE CONSTRAINT DEPT_DNAME_UNIQUE,
)
IN TABLESPACE USER_DATA
EXTENT SIZE 10 NEXT SIZE 10
CREATE TABLE USER_DB.DEPT_ADMIN.DEPT (
DEPT VARCHAR(4) NOT NULL,
DNAME VARCHAR(30) NOT NULL,
CONSTRAINT DEPT_DEPT_PK
PRIMARY KEY CLUSTERED (DEPT),
CONSTRAINT DEPT_DNAME_UNIQUE
UNIQUE NONCLUSTERED (DNAME)
)


使用SELECT语句生成表
在使用Informix的情况下,用户只能借助SELECT指令生成临时表。而Microsoft SQL Server则提供了凭借SELECT INTO语句生成新表的能力。

Informix
Microsoft SQL Server

SELECT * INTO TEMP STUDENTBACKUP FROM STUDENT
SELECT * INTO STUDENTBACKUP
FROM STUDENT


除非SELECT…INTO语句所适用的数据库已将数据库配置选项select into/bulkcopy设定为true,否则,该语句将不会发挥作用。(数据库所有者可借助SQL Server企业管理器或Transact-SQL sp_dboption系统存储过程对上述选项加以设定。)请使用sp_helpdb系统存储过程检查数据库所处状态。如果select into/bulkcopy未被设定为true,则仍可使用SELECT语句向临时表中进行复制:

SELECT * INTO #student_backup FROM user_db.student_admin.student

在使用SELECT.. INTO语句生成新表时,引用完整性定义将不会被转移至新表。

将select into/bulkcopy选项设定为true的要求有可能导致迁移过程趋于复杂化。如果您必须借助SELECT语句将数据复制到表中,则应先生成新表,再使用INSERT INTO…SELECT语句加载该表。Informix和SQL Server中的语法完全一致,并且无需对任何数据库选项加以设定。

视图
Microsoft SQL Server和Informix用以创建视图的语法较为相似。

Informix
Microsoft SQL Server

CREATE VIEW view_name
[(column_name [, column_name]...)]
AS select_statement

CREATE VIEW view_name
[(column_name [, column_name]...)]

AS select_statement


Informix和SQL Server视图不仅要求相关表确实存在,而且,还需要视图所有者具备对SELECT语句所指定的已请求表实施访问调用的特权。

在缺省状态下,系统并不会对基于视图的数据修改语句进行检查,以确定受到影响的行是否位于视图范围内。如需对所有修改进行检查,则应使用WITH CHECK OPTION..

SQL Server和Informix均可借助算术表达式、函数和常数表达式为导出列提供支持。SQL Server所具有的某些特定区别体现为:

• 如果数据修改语句(INSERT或UPDATE)只会对基表构成影响,则可在多表视图中使用它们。在单个语句中,无法将数据修改语句用于一个以上表。

• READTEXT或WRITETEXT无法被用于视图中的text或image列。

• 无法使用ORDER BY、COMPUTE、FOR BROWSE或COMPUTE BY子句。

• 无法在视图中使用INTO关键字。


在使用外部联接定义视图并以针对外部联接内部表中某一列的限定对视图进行查询时,来自SQL Server和Informix的结果将有所不同。在大多数情况下,Informix将可被轻松转换成SQL Server。

Informix
Informix与Microsoft SQL Server

CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(DECODE(grade
,'A', 4
,'A+', 4.3
,'A-', 3.7
,'B', 3
,'B+', 3.3
,'B-', 2.7
,'C', 2
,'C+', 2.3
,'C-', 1.7
,'D', 1
,'D+', 1.3
,'D-', 0.7
,0)),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(CASE grade
WHEN 'A' THEN 4
WHEN 'A+' THEN 4.3
WHEN 'A-' THEN 3.7
WHEN 'B' THEN 3
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
END),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN

zrwlh 发表于 2010-9-3 16:02:39

没看懂。。。。。。。。。。。
页: [1]
查看完整版本: 定义数据库对象