-
- DROP ROW TYPE 语句
使用 DROP ROW TYPE 语句从数据库中删除现有的名为 ROW 的数据类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 | 描述 | 限制 | 语法 |
owner | ROW 类型所有者的名称 | 必须是 row_type 的所有者 | 所有者名称 |
row_type | 要删除的现有的 ROW 数据类型的名称 | 必须存在。另见后面的用法部分 | 标识符; 数据类型 |
用法
DROP ROW TYPE 语句从 sysxtdtypes 系统目录表中删除指定 row_type 的条目。您必须是指定名称的 ROW 数据类型的所有者或具有 DBA 权限才可以 使用 DROP ROW TYPE 语句。
如果您包含可选的 IF EXISTS 关键字,则没有指定名称的 ROW 数据类型在当前数据库中存在,则数据库服务器不采取任何操作(而不是向应用程序发送异常)。
如果一个已命名的 ROW 数据类型的名称正在使用中,则不能删除该数据类型。当以下的任何条件为真时,不能删除已命名的 ROW 数据类型:
- 任何现有的表或列正在使用已命名的 ROW 数据类型。
- 已命名的 ROW 数据类型在继承层次结构中是超类型。
- 在已命名的 ROW 数据类型的列上定义了视图。
要从表中删除名为 ROW 类型的列,请使用 ALTER TABLE。
DROP ROW TYPE 语句不能删除未命名的 ROW 数据类型。
RESTRICT 关键字
RESTRICT 关键字要求同 DROP ROW TYPE 语句使用。如果 row_type 上的从属性存在,则 RESTRICT 会引起 DROP ROW TYPE 失败。
如果以下任一条件为真,则 DROP ROW TYPE 语句失败并返回错误消息:
- 已命名的 ROW 数据类型用于现有的表或列。
查看 systables 和 syscolumns 系统目录表来查找是否任何表或数据类型使用了已命名的 ROW 数据类型。
- 已命名的 ROW 数据类型在继承层次结构中是超类型。
查找 sysinherits 系统目录表来查看哪一个已命名的ROW 数据类型具有子类型。
以下语句删除了已命名的 ROW 数据类型 employee_t:
DROP ROW TYPE employee_t RESTRICT
-
- DROP SECURITY 语句
使用 DROP SECURITY 语句从当前数据库中删除现有的安全对象。此对象可以是安全策略、安全标签或安全标签组件。
该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 | 描述 | 限制 | 语法 |
component | 要删除的安全标签组件 | 必须在数据库中存在 | 标识符 |
label | 要删除的安全标签 | 必须作为指定 policy 的标签存在于数据库中 | 标识符 |
policy | 要删除的安全策略 | 必须在数据库中存在 | 标识符 |
用法
只有 DBSECADM 能发出此语句。当成功执行 DROP SECURITY 语句后,数据库服务器从系统目录的表中删除引用指定对象的名称和数字标识符的任何行,这些表为:
- 对于安全策略是 sysecpolicies
- 对于安全标签是 sysseclabels
- 对于安全标签组件是 sysseclabelcomponents 。
跟随在 SECURITY 关键字之后的关键字标识正在删除的安全对象的类型。
- SECURITY POLICY policy 指定一个安全策略
- SECURITY LABEL policy.label 指定一个安全标签
- SECURITY LABEL COMPONENT component 指定一个安全标签组件。
没有 SQL 语句可以在不会破坏整个组件的情况下选择性地删除安全标签组件的某些元素。要从数据库中只删除安全标签组件的一部分元素,DBSECADM 可以使用 DROP SECURITY LABEL COMPONENT 语句删除组件,然后使用 CREATE SECURITY LABEL COMPONENT 语句重新定义删除的子句,但不包括任何不再需要的元素。(另一种方法是删除包含已弃用元素的所有安全标签,然后使用 CREATE SECURITY LABEL 语句重新定义具有已删除标签相同的组件的新标签,但不包含这些元素。在这种情况下,已弃用的元素将保留在数据库中,但是没有安全标签会将它们用作组件的值。)
如果您包含了可选的 IF EXISTS 关键字,则如果在当前数据库中未注册指定的安全对象类型和指定名称的安全对象,则数据库服务器不会执行任何操作(而不是向应用程序发送异常)。
示例
以下语句指示数据库服务器删除安全标签 witty:
DROP SECURITY LABEL witty;
如果有列被 witty 标签保护或者有用户持有此标签,则该语句失败。
下一个示例指示数据库服务器从数据库中删除安全标签组件 adhesive:
DROP SECURITY LABEL COMPONENT adhesive;
如果安全策略取决于 adhesive 安全标签组件,则该语句失败。
以下示例指示数据库服务器以 CASCADE 方式删除 best 安全策略:
DROP SECURITY POLICY best CASCADE;
如果该策略正在包含任何表,则该语句失败。但是,如果该语句成功,则因为 CASCADE 规范它会产生以下附加的影响:
- 所有与 best 安全策略的相关联的安全标签都会被删除。
- 所有 best 安全策略撤销的豁免权。
- 由于 best 安全策略而删除的所有安全标签都将从拥有这些标签的所有用户中撤销。
以 RESTRICT 方式或 CASCADE 方式删除安全标签对象
缺省情况下,当删除任何安全对象时,RESTRICT 关键字生效。在 CASCADE 模式下指定删除安全策略。如果满足以下任一条件,DBSECADM 不能删除 RESTRICT 模式下的安全策略:
- 表由安全策略保护
- 安全标签取决于此安全策略
- 用户已获得该安全策略规则的豁免。
如果安全策略正在保护表,则该策略不能以 CASCADE 模式删除。当安全策略以 CASCADE 模式成功删除时,则下列安全对象也会被删除或撤销:
- 所有与已删除的安全策略相关联的安全标签
- 所有已删除的安全标签也将从拥有这些标签的用户中撤销
- 撤销删除的安全策略的所有豁免。
如果满足以下任一条件,则不能在 RESTRICT 模式中删除安全标签(RESTRICT 模式是唯一支持的删除安全标签的模式):
- 列被安全标签保护
- 用户拥有此安全标签。
如果任何安全策略取决于该安全标签组件,则不能在 RESTRICTA 模式中删除安全标签组件,这是唯一支持的删除组件的模式。