索引名约定
[[[server.]database.]owner.] table_name
[schema.]table_name
假设你是从一个Oracle脚本或者程序开始的,该脚本或者程序用来创建你的数据库对象。拷贝你的脚本或者程序并且进行如下修改。这些修改将在本部分的其他地方加以讨论。该例子是从示例应用程序脚本Oratable.sql和Sstable.sql中截取的:
- 确保数据库对象标识遵循Microsoft SQL Server命名法则。你可能只需要修改索引的名字。
- 修改数据存储参数使之能在SQL Server下工作。如果你使用RAID,就不需要任何存储参数了。
- 修改Oracle约束定义使之能在SQL Server中工作。如果需要的话,创建一个触发器以支持外部键DELETE CASCADE语句。如果表跨数据库的话,使用触发器来增强外部键的关系。
- 修改CREATE INDEX语句以利用分簇的索引。
- 使用数据转换服务来创建新的CREATE TABLE语句。回顾该语句,注意Oracle数据类型是如何映射到SQL Server数据类型上的。
- 清除所有的CREATE SEQUENCE语句。在CREATE TABLE或者ALTER TABLE语句中使用同等列来替换顺序的使用。
- 如果需要的话,修改CREATE VIEW语句。
- 清除所有对同义字的引用。
- 评估对Microsoft SQL Server临时表的使用和其在你的应用程序中的用处。
- 把所有的Oracle的CREATE TABLE…AS SELECT命令改为SQL Server的SELECT…INTO语句。
- 评估潜在的对用户定义规则、数据类型和缺省的使用。
数据对象标识符
下表比较了Oracle和Microsoft SQL Server是如何处理对象标识符的。在许多情况下,当移植到SQL Server上时,你不需要改变对象的名字。
Oracle
Microsoft SQL
1-30 字符长度。 数据库名称:最多8个字符长度。 数据库连接名称:最多128个字符长度。
1-128 Unicode字符长度。 临时表名称:最多116个字符。
标识符的名称必须用:字母、包含文字数字的字符、或者字符_, $, 和 #开头
标识符名称可以用:字母数字字符、或者_开头,实际上可以用任何字符开头。
如果标识符用空格开头,或者包含了不是_、@、#、或者$的字符,你必须用[](定界符)包围标识符名称
如果一个对象用下面这些字符开头: @ 则表明该对象是一个本地变量。 # 则该对象是一个本地临时对象。 ## 则该对象是一个全局临时对象
表空间名必须唯一.
数据库名必须唯一
标识符名在用户账号(计划,Schema)范围内必须唯一。
标识符名在数据库用户账号范围内必须唯一
列名在表和视图范围内必须唯一。
列名在表和视图范围内必须唯一。
索引名在用户账号(Schema)范围内必须唯一。
索引名在数据库表名范围内必须唯一
修饰表名
当访问存在于你的用户账号中的表时,该表可以简单的通过未经限制的表名来选中。访问其他Oracle计划中的表就需要把该计划的名字作为前缀加到表名上,两者之间用点号(.)隔开。Oracle同义字可以提供更高的位置透明度。
涉及到表时,Microsoft SQL Server采用一种不同的方法。因为一个SQL Server登录账号可以在多个数据库中用同一个名字创建一个表,所以采用下面的方法来访问表和视图:[[数据库名字]所有者名字]表名]
用……访问一个表
Oracle
Microsoft SQL Server
你的用户账号
SELECT * FROM STUDENT
SELECT * FROM USER_DB.STUDENT_ ADMIN.STUDENT
其他模式(schema)
SELECT * FROM STUDENT_ADMIN.STUDENT
SELECT * FROM OTHER_DB.STUDENT_ ADMIN.STUDENT
这是一些为Microsoft SQL Server表和视图命名的指导方针:
- 使用数据库名字和用户名字是可选的。如果一个表只通过名字加以引用(例如,STUDENT),SQL Server在当前数据库中以当前用户帐号搜索该表。如果没有找到,就在数据库中寻找由dbo的保留用户名拥有的具有同样名字的对象。表名在同一个数据库中的同一个用户帐号下必须是唯一的。
- 同一个SQL Server登录账号可以在多个数据库中拥有同样名字的表。例如,ENDUSER1账号拥有下列数据库对象:USER_DB.ENDUSER1.STUDENT和OTHER_DB.ENDUSER1.STUDENT。这里所加的限制是数据库用户名而不是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表上做要求的数据库操作。如果在ENDUSER1数据库账号下没有找到该表,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就做如下搜寻:
- STUDENT_DB.current_user.STUDENT
- STUDENT_DB.DBO.STUDENT
如果应用程序一次只使用一个数据库,在做对象引用时省略数据库名字,这样的话,该应用程序可以方便的用于其他数据库。所有的对象引用都隐含的访问当前所用的数据库。这对于你要想在同一台服务器上维持一个测试数据库和一个产品数据库时很有用
创建表
因为Oracle和SQL Server都支持SQL-92条目级(entry-level)的关于标识RDBMS对象的协议,CREATE TABLE的语法是相似的。
Oracle
Microsoft SQL
CREATE TABLE [schema.]table_name ( {col_name column_properties [default_expression] [constraint [constraint [...constraint]]]| [[,] constraint]} [[,] {next_col_name | next_constraint}...] ) [Oracle Specific Data Storage Parameters]
CREATE TABLE [server.][database.][owner.] table_name ( {col_name column_properties[constraint [constraint [...constraint]]]| [[,] constraint]} [[,] {next_col_name | next_constraint}...] ) [ON filegroup_name]
Oracle数据库对象名字是不分大小写的。在Microsoft SQL Server中,数据库对象的名字可以是大小写敏感的,这要看安装时的设置。
当SQL Server第一次设置的时候,缺省的排序顺序是字典顺序,区分大小写。(可以用SQL ServerSetup来做不同的设置)因为Oracle对象的名字总是唯一的,你在把数据库对象移植到SQL Server上时不会遇到任何的麻烦。建议你把Oracle和SQL Server中的所有的表和列的名字都写成大写的以避免万一有用户安装了区分大小写的SQL Server时出问题。
表和索引存储参数
对于Microsoft SQL Server,使用RAID通常可以简化数据库对象的放置。在表的结构中集成了一个SQL Server的分簇的索引,就像一个Oracle索引组织表一样。
Oracle
Microsoft SQL
CREATE TABLE DEPT_ADMIN.DEPT ( DEPTVARCHAR2(4) NOT NULL, DNAMEVARCHAR2(30) NOT NULL, CONSTRAINT DEPT_DEPT_PK PRIMARY KEY (DEPT) USING INDEX TABLESPACE USER_DATA PCTFREE 0 STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 1 MAXEXTENTS UNLIMITED), CONSTRAINT DEPT_DNAME_UNIQUE UNIQUE (DNAME) USING INDEX TABLESPACE USER_DATA PCTFREE 0 STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 1 MAXEXTENTS UNLIMITED) ) PCTFREE 10PCTUSED 40 TABLESPACE USER_DATA STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 1 MAXEXTENTS UNLIMITED FREELISTS 1)
CREATE TABLE USER_DB.DEPT_ADMIN.DEPT ( DEPTVARCHAR(4) NOT NULL, DNAMEVARCHAR(30) NOT NULL, CONSTRAINT DEPT_DEPT_PK PRIMARY KEY CLUSTERED (DEPT), CONSTRAINT DEPT_DNAME_UNIQUE UNIQUE NONCLUSTERED (DNAME) )
用SELECT语句创建表
使用Oracle,一个表可以用任何有效的SELECT命令创建。Microsoft SQL Server提供了同样的功能,但是语法不一样。
Oracle
Microsoft SQL
CREATE TABLE STUDENTBACKUP AS SELECT * FROM STUDENT
SELECT * INTO STUDENTBACKUP FROM STUDENT
要SELECT…INTO能够起作用,必须将使用该程序的数据库的选项select into/bulkcopy设定为true。(数据库所有者可以用SQL Server Enterprise Manager或者T 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> [Access]sql随机抽取记录 [Access]ASP&SQL让select查询结果随机排序的实现方法 [聊天工具]企业邮件系统的利器----FoxMail Server [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜 [系统软件]SQL语句性能优化--LECCO SQL Expert [系统软件]关于Windows2000Server的灾难恢复 [常用软件][网络]下载服务革命性风暴Poco Server评测 [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信… [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现
|