DENY 语句在安全系统中创建一个条目,拒绝当前数据库中安全帐户的权限,并禁止安全帐户以组或角色成员身份继承权限。Oracle 没有 DENY 语句。REVOKE 语句撤销以前授予当前数据库中一个用户的权限或被其拒绝的权限。
Oracle Microsoft SQL Server GRANT {ALL [PRIVILEGES] | permission[,Un]} { [(column[,Un])] ON {table | view} | ON {table | view}[(column[,Un])] | ON {stored_procedure | extended_procedure} } TO security_account[,Un] [WITH GRANT OPTION] [AS {group | role}] REVOKE [GRANT OPTION FOR] {ALL [PRIVILEGES] | GRANT {ALL permission[,Un]} [PRIVILEGES][column_list] | { permission_list [column_list]} [(column[,Un])] ON {table | view} ON {table_name [(column_list)] | ON {table | view}[(column[,Un])] | view_name [(column_list)] | {stored_procedure | | stored_procedure_name} extended_procedure} TO {PUBLIC | name_list } } [WITH GRANT OPTION] {TO | FROM} security_account[,Un] [CASCADE] [AS {group | role}] DENY {ALL [PRIVILEGES] | permission[,Un]} { [(column[,Un])] ON {table | view} | ON {table | view}[(column[,Un])] | ON {stored_procedure | extended_procedure} } TO security_account[,Un] [CASCADE] 有关对象级权限的详细信息,请参见 SQL Server Books Online。
在 Oracle 中,REFERENCES 权限只能授予一个用户。SQL Server 则允许将 REFERENCES 权限授予数据库用户和数据库组。在 Oracle 和 SQL Server 中,INSERT、UPDATE、DELETE 和 SELECT 权限授予的方式相同。
实施数据完整性和业务规则
实施数据完整性确保了数据库中数据的质量。在表的规划中,有两个重要的步骤,即识别列的有效值,以及确定如何在列中实施数据完整性。数据完整性可以分为四个类别,并用不同的方法来实施。
完整性类型 实体完整性 范围完整性 引用完整性 用户定义的完整性 实施方式 PRIMARY KEY 约束 UNIQUE 约束 IDENTITY 属性 DEFAULT 定义 FOREIGN KEY 约束 CHECK 约束 为空性 范围 DEFAULT 定义 FOREIGN KEY 约束 CHECK 约束 为空性 在 CREATE TABLE 中的列级和表级约束 存储过程 触发器。 实体完整性把一行定义为特定表的一个单独实体。实体完整性通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性,来实施表的标识符列或主键的完整性。
约束的命名
应该始终显式命名约束。如果没有,则 Oracle 和 Microsoft SQL Server 使用不同的命名规则隐式命名约束。这些命名上的差别会给迁移过程带来不必要的麻烦。在删除或禁用约束时,就会造成不一致,因为必须使用名称,约束才能被删除。对于 Oracle 和 SQL Server 来说,显式命名约束的语法是相同的。 CONSTRAINT constraint_name
主键和唯一列
SQL-92 标准要求,主键中的所有值应该唯一,并且该列不允许有空值。一旦定义了 PRIMARY KEY 或 UNIQUE 约束,Oracle 和 Microsoft SQL Server 通过自动创建唯一索引,来实施唯一性。此外,主键列自动定义为 NOT NULL。每个表只允许一个主键。
对主键来说,默认地创建一个 SQL Server 聚集索引,尽管也可以请求非聚集索引。主键上的 Oracle 索引可以通过删除或禁用该约束来删除,而 SQL Server 索引只能通过删除该约束来删除。
在两种 RDBMS 中,均可使用 UNIQUE 约束来定义备用键。在任一表上,均可定义多个 UNIQUE 约束。UNIQUE 约束列可为空。在 SQL Server 中,除非另外指定,默认创建非聚集索引。 在迁移应用程序时,要注意,对于完全唯一键(单个或多个列索引),SQL Server 只允许一行包含 NULL 值,而 Oracle 允许任意数量的行包含 NULL 值。
Oracle CREATE TABLE DEPT_ADMIN.DEPT (DEPT VARCHAR2(4) NOT NULL, DNAME VARCHAR2(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) ) Microsoft SQL Server 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) ) 增加和删除约束
禁用约束可以提高数据库性能和简化数据复制过程。例如,在远程站点重建或复制表数据时,不需要再重复约束检查,因为数据最初插到表中时,数据完整性已经检查过了。可以编写一个 Oracle 应用程序,禁用或启用约束(除 PRIMARY KEY 和 UNIQUE 外)。在 Microsoft SQL Server 中,将 ALTER TABLE 语句与 CHECK 和 WITH ONCHECK 选项一起使用,也可实现上述过程。 此插图给出了,这一过程的对比。
在 SQL Server 中,可以使用 NOCHECK 子句和 ALL 关键字延迟所有的表约束。
如果 Oracle 应用程序要使用 CASCADE 选项禁用或删除 PRIMARY KEY 或 UNIQUE 约束,则可能需要重写一些代码,因为 CASCADE 选项禁用或删除父约束及其相关的任何子完整性约束。 下面是该语法的一个示例:
DROP CONSTRAINT DEPT_DEPT_PK CASCADE
必须修改 SQL Server 应用程序,使其先删除子约束,然后再删除父约束。例如,要删除 DEPT 表上的 PRIMARY KEY 约束,必须删除列 STUDENT.MAJOR 和 CLASS.DEPT 上的外键。下面是该语法的一个示例: ALTER TABLE STUDENT
DROP CONSTRAINT STUDENT_MAJOR_FK ALTER TABLE CLASS
DROP CONSTRAINT CLASS_DEPT_FK ALTER TABLE DEPT
DROP CONSTRAINT DEPT_DEPT_PK
ALTER TABLE 语法(用于增添和删除约束)对 Oracle 和 SQL Server 几乎是相同的。
产生连续的数值
如果 Oracle 应用程序使用 SEQUENCE,则可以方便地对它进行修改,来使用 Microsoft SQL Server IDENTITY 属性。
类别 语法 Microsoft SQL Server IDENTITY CREATE TABLE new_employees ( Empid int IDENTITY (1,1), Employee_Name varchar(60), CONSTRAINT Emp_PK PRIMARY KEY (Empid) ) 如果增加间隔为 5: CREATE TABLE new_employees ( Empid int IDENTITY (1,5), Employee_Name varchar(60), CONSTRAINT Emp_PK PRIMARY KEY (Empid) ) 每个表中的标识符一个 列 允许空值 否 可否使用默认约束、不能使用 值 实施唯一性 是 在 INSERT、SELECT INTO 或大容量复制语句完成之后,查询@@IDENTITY (function) 当前最大的标识编号 返回在标识符列创建过程中指定的种IDENT_SEED('table_name') 子值 返回在标识符列创建过程中指定的增IDENT_INCR('table_name') 量值 当引用具有 IDENTITY 属性的列时,在 SELECT、SELECT 语法 INSERT、UPDATE 和 DELETE 语句中,可以使用关键字 IDENTITYCOL 代替列的名称。 尽管 IDENTITY 属性在一个表中自动完成行编号,但不同的表(每个表均有其自己的标识符列)的属性值可能会相同。这是因为,IDENTITY 属性只保证在使用它的表中唯一。如果应用程序必须生成一个标识符列,其在整个数据库中、或者甚至每个联网计算机上的每个数据库中都是唯一,则使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数。SQL Server 使用全局唯一标识符列,来合并复制,确保在表的多个副本中,行被唯一地标识。 有关创建和修改标识符列的详细信息,请参见 SQL Server Books Online。
对于给定列,范围完整性实施了有效的条目。范围完整性是通过限制可能值的类型(通过数据类型)、格式(通过 CHECK 约束)或范围(通过 REFERENCE 和 CHECK 约束)实施的。
DEFAULT 和 CHECK 约束
Oracle 把默认值作为列属性,而 Microsoft SQL Server 把默认值作为约束。SQL Server DEFAULT 约束可以包含常量、不带参数的内置函数(niladci 函数)或 NULL。
要方便地迁移 Oracle DEFAULT 列属性,应该在 SQL Server 列级中定义 DEFAULT 约束,而不必使用约束名称。对于每个 DEFAULT 约束,SQL Server 均生成一个唯一的名称。
在 Oracle 和 SQL Server 中,定义 CHECK 约束的语法是相同的。搜索条件必须对一个布尔表达式进行求值,并且不能包括子查询。列级 CHECK 约束只能引用受约束的列,表级 CHECK 约束只可以引用受约束表中的列。可以为一个表定义多个 CHECK 约束。在 CREATE TABLE 语句中,SQL Server 语法规定,在一个列上只允许创建一个列级 CHECK 约束,约束可以有多个条件。 测试修改后的 CREATE TABLE 语句的最好方法是,使用 SQL Server 中的 SQL Server 查询分析器,并分析该语法。结果窗格给出所有的错误。有关约束语法的详细信息,请参见 SQL Server Books Online。