1.1SET Database Object Mode 语句
使用 SET Database Object Mode 语句来更改约束和唯一索引的过滤模式,或启用或禁用约束、索引和触发器,或在此语句正在重置它们的约束模式时绕过外键约束的引用完整性检查。
此语句是对 SQL 的 ANSI/ISO 标准的扩展。要指定是在语句级还是在事务级检查约束,请参阅 SET Transaction Mode 语句。
语法
用法
在此语句的上下文中,database object有索引、触发器或约束的受限的含义,而不是在 其它语法段 中定义的 数据库对象名 段描述此术语的那种更通用的含义。
SET Database Object Mode 语句的作用域限定在当前连接的会话的本地数据库中的约束、索引或触发器。在您更改对象的模式之后,新模式对那个数据库的所有会话生效,并保持生效,直到另一 SET Database Object Mode 语句再次更改它为止,或直到从该数据库删除该对象为止。
重要:
此语句可将外键约束重置到的 NOVALIDATE 模式对上述通用语句是一例外,如本主题下列部分所说明的那样。
触发器、索引和约束的对象模式
允许重复的值的触发器和索引仅可用两种对象模式:
启用的(通过 ENABLED 关键字)
DISABLED 禁用的(通过 DISABLED 关键字)
对于约束和唯一索引,您还可指定两种附加的模式:
不带有违反完整性错误的过滤(通过 FILTERING WITHOUT ERROR 关键字)
带有违反完整性错误的过滤(通过 FILTERING WITH ERROR 关键字)
对于外键约束,您还可指定三种附加的模式:
启用的,但不检查违反完整性错误(通过 ENABLED NOVALIDATE 关键字)
带有违反完整性错误的过滤,但不检查违反完整性错误(通过 FILTERING WITH ERROR NOVALIDATE 关键字)
不带有违反完整性错误的过滤,但不检查违反完整性错误(通过 FILTERING WITHOUT ERROR NOVALIDATE 关键字)。
在运行 SET Database Object Mode 语句时,仅最后三种约束模式保持,之后,该约束模式转换为相应的启用或过滤模式,且在后续的 DML 操作过程中强制要求引用的完整性。但对于那些被认为不违反引用的约束的大型表,这些绕过违反外键约束的模式可显著地减少迁移或导入大型数据集所需要的时间。
在任何给定的时刻,对象必须恰好处于这些模式中的一种之中。这些模式,有时称为对象状态,在 数据库对象模式的定义 部分描述。
sysobjstate 系统目录表描述数据库中的所有约束、索引和触发器对象,以及每一对象的当前模式。由于仅在指定那种模式的 SET CONSTRAINTS 语句或 ALTER TABLE ADD CONSTRAINT 语句期间保持该 NOVALIDATE 模式,sysobjstate 表不理会 NOVALIDATE 模式,其仅在那些 DDL 语句之内阻止违反检查。要获取关于 sysobjstate 表的信息,请参阅 GBase 8s SQL 参考指南。
在集群环境中,在可更新的辅助服务器上,不支持 SET Database Object Mode 语句。(更为通用地,对于辅助服务器的数据库中的表上的 UPDATA 操作,该语句指定的任何会话级索引、触发器或约束模式不会重定向。)
更改数据库对象模式所需要的权限
要更改约束、索引或触发器的模式,您必须有必要的访问权限。你必须至少满足这些要求之一:
您必须有对数据库的 DBA 权限。
您必须是在其上定义该数据库对象的表的所有者,且您还必须有对该数据库的 Resource 权限。
您必须有对在其上定义该数据库的表的 Alter 权限,且您必须还有对该数据库的 Resource 权限。
对象列表格式
使用对象列表格式来更改一个或多个约束、索引或触发器的模式。
对象列表格式
元素 描述 限制 语法
constraint 要设置其模式的约束的名称 必须是本地的约束,且该列表中的所有约束必须定义在同一表上 标识符
index 要设置其模式的索引的名称 必须是本地的索引,且该列表中的所有索引必须定义在同一表上 标识符
trigger 要设置其模式的触发器的名称 必须是本地的触发器,且该列表中的所有触发器必须定义在同一表或视图上 标识符
例如,要将 cust_subset 表上的唯一索引 unq_ssn 的模式更改为过滤的,请输入下列语句:
SET INDEXES unq_ssn FILTERING;
您还可使用对象列表格式来更改定义在同一表上的约束、索引或触发器的列表的模式。假设在 cust_subset 表上定义四个触发器:insert_trig、update_trig、delete_trig 和 execute_trig。还假设启用全部四个触发器。要禁用除了 execute_trig 之外的所有触发器,请输入此语句:
SET TRIGGERS insert_trig, update_trig, delete_trig DISABLED;
如果 my_trig 是在视图上的禁用的 INSTEAD OF 触发器,则下列语句启用那个触发器:
SET TRIGGERS my_trig ENABLED;
在集群环境中,在可更新的辅助服务器上不支持 SET TRIGGERS 语句。更为通用地,SET Database Object Mode 语句指定的会话级索引、触发器和约束模式,对于辅助服务器的数据库中的表对象上的 UPDATA 操作不重定向。