TRANSFER OWNERSHIP 语句
TRANSFER OWNERSHIP 语句用于传输数据库对象的所有权。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
- 对象的所有权
- SECADM 权限
语法
描述
- alias-designator
- ALIAS alias-name
- 标识要转移其所有权的别名。 alias-name 必须标识该目录中描述的别名 (SQLSTATE 42704)。 如果指定了 PUBLIC ,那么 alias-name 必须标识当前服务器上存在的公用别名 (SQLSTATE 42704)。
- FOR TABLE 或 FOR SEQUENCE
- 指定该别名的对象类型。
- FOR TABLE
- 别名是表、视图或昵称的别名。 当转移别名的所有权时, SYSCAT.TABLES 目录视图将替换为新所有者的授权标识。
- FOR SEQUENCE
- 别名是序列的别名。 当转移别名的所有权时, SYSCAT.SEQUENCES 目录视图中别名的 OWNER 列中的值将替换为新所有者的授权标识。
- 约束 table-name.constraint-name
- 标识要转移其所有权的约束。 table-name.constraint-name 组合必须标识约束及其约束的表。 constraint-name 必须标识目录中描述的约束 (SQLSTATE 42704)。当转移约束的所有权时, SYSCAT.TABCONST 目录视图将替换为新所有者的授权标识。
- 若约束为外键约束,则 SYSCAT.REFERENCES 目录视图中的OWNER列将替换为新所有者的授权ID。
- 如果约束是 PRIMARY KEY 或 UNIQUE 约束,那么 SYSCAT.INDEXES 目录视图将替换为新所有者的授权标识。 如果索引存在,并且在此情况下复用了该索引,那么不会更改该索引的所有者。
- DATABASE PARTITION GROUP db-PARTITION-GROUP-name
- 标识要转移其所有权的数据库分区组。 db-partition-group-name 必须标识目录中描述的数据库分区组 (SQLSTATE 42704)。
传输数据库分区组的所有权时, SYSCAT.DBPARTITIONGROUPS 目录视图将替换为新所有者的授权标识。
- EVENT MONITOR EVENT-MONITOR-name
- 标识要转移其所有权的事件监视器。 event-monitor-name 必须识别在目录中描述的事件监视器 (SQLSTATE 42704)。
当转移事件监视器的所有权时, SYSCAT.EVENTMONITORS 目录视图将替换为新所有者的授权标识。
如果标识的事件监视器处于活动状态,那么将返回错误 (SQLSTATE 429BT)。
如果 WRITE TO FILE 事件监视器的目标路径中存在要传输其所有权的事件文件,那么不会删除这些事件文件。
当传输 WRITE TO TABLE 事件监视器的所有权时, SYSCAT.EVENTTABLES 目录视图。
函数标识符 - 标识要转移其所有权的函数。 有关更多信息,请参阅 函数,方法和过程指示符。 指定的函数实例必须是目录中描述的用户定义的函数或函数模板。 无法传输 CREATE TYPE 语句隐式生成的函数的所有权 (SQLSTATE 429BT)。
当转移函数的所有权时, SYSCAT.ROUTINES 目录视图将替换为新所有者的授权标识。 转移具有关联包的 SQL 函数的所有权也会隐式地将该包的所有权转移给新所有者。
- 特定功能 特定名称
- 使用在函数创建时指定或缺省为的特定名称,标识要转移其所有权的特定用户定义函数。 在动态 SQL 语句中,使用
CURRENT SCHEMA 专用寄存器作为未限定的对象名的限定符。 在静态 SQL 语句中,QUALIFIER
预编译或绑定选项隐式地指定未限定的对象名的限定符。 specific-name 必须标识指定模式或隐式模式中的特定函数实例; 否则,将返回错误 (SQLSTATE 42704)。
当转移特定函数的所有权时, SYSCAT.ROUTINES 目录视图将替换为新所有者的授权标识。
- FUNCTION MAPPING FUNCTION-MAPPING-name
- 标识要转移其所有权的函数映射。 function-mapping-name 必须标识目录中描述的函数映射 (SQLSTATE 42704)。
当转移函数映射的所有权时, SYSCAT.FUNCMAPPINGS 目录视图将替换为新所有者的授权标识。
- INDEX index-name
- 标识要转移其所有权的索引或索引规范。 index-name 必须标识该目录中描述的索引或索引规范 (SQLSTATE 42704)。
当转移索引的所有权时, SYSCAT.INDEXES 目录视图将替换为新所有者的授权标识。
如果定义了索引的表是全局临时表 (SQLSTATE 429BT) ,那么无法转移索引的所有权。
- 索引扩展索引扩展名称
- 标识要转移其所有权的索引扩展。 index-extension-name 必须识别在目录中描述的索引扩展 (SQLSTATE 42704)。
当转移索引扩展的所有权时, SYSCAT.INDEXEXTENSIONS 目录视图将替换为新所有者的授权标识。
方法标识符 - 标识要转移其所有权的方法。 有关更多信息,请参阅 函数,方法和过程指示符。 指定的方法主体必须是目录中描述的方法 (SQLSTATE 42704)。 无法传输 CREATE TYPE 语句隐式生成的方法的所有权 (SQLSTATE 429BT)。
传输方法的所有权时, SYSCAT.ROUTINES 目录视图将替换为新所有者的授权标识。
- NICKNAME nickname
- 标识要转移其所有权的昵称。 nickname 必须是目录中描述的昵称 (SQLSTATE 42704)。
当转移昵称的所有权时, SYSCAT.TABLES 目录视图将替换为新所有者的授权标识。
- PACKAGE package-name
- 标识要转移其所有权的包。 该软件包名称必须标识目录中描述的软件包 (SQLSTATE 42704)。
- VERSION version-id
- 标识要转移其所有权的软件包版本。 如果未指定值,那么版本将缺省为空字符串,并且将转移此包的所有权。 如果存在多个具有相同软件包名称但不同版本的软件包,那么将仅传输其 version-id 在 TRANSFER OWNERSHIP 语句中指定的软件包的所有权。 在以下情况下会使用双引号来定界版本标识:
- 由 VERSION(AUTO) 预编译器选项生成
- 以数字开头
- 包含小写或混合大小写字母
传输程序包的所有权时, SYSCAT.PACKAGES 目录视图将替换为新所有者的授权标识。
无法传输与 SQL 过程,编译型 SQL 函数或编译型触发器相关联的包的所有权 (SQLSTATE 429BT)。
过程标识符 - 标识要转移其所有权的过程。 有关更多信息,请参阅 函数,方法和过程指示符。 指定的过程实例必须是目录中描述的过程。
当转移过程的所有权时, SYSCAT.ROUTINES 目录视图将替换为新所有者的授权标识。
转移具有关联包的 SQL 过程的所有权也会隐式地将该包的所有权转移给新所有者。
- 特定过程 specific-name
- 使用在创建过程时指定或缺省为的特定名称来标识要转移其所有权的特定过程。 在动态 SQL 语句中,使用
CURRENT SCHEMA 专用寄存器作为未限定的对象名的限定符。 在静态 SQL 语句中,QUALIFIER
预编译或绑定选项隐式地指定未限定的对象名的限定符。 specific-name 必须标识指定或隐式模式中的特定过程实例; 否则,将返回错误 (SQLSTATE 42704)。
当转移特定过程的所有权时, SYSCAT.ROUTINES 目录视图将替换为新所有者的授权标识。
- SCHEMA 模式名称
- 标识要转移其所有权的模式。 schema-name 必须识别目录中所描述的模式 (SQLSTATE 42704)。
当转移模式所有权时, SYSCAT.SCHEMATA 目录视图中模式的 OWNER 列 和 DEFINER 列 中的值将替换为新所有者的授权标识。
无法传输内置模式 (定义程序为 SYSIBM) 的所有权 (SQLSTATE 42832)。
- SEQUENCE sequence-name
- 标识要转移其所有权的序列。 sequence-name 必须标识目录中描述的序列 (SQLSTATE 42704)。
当传输序列的所有权时, SYSCAT.SEQUENCES 目录视图中模式的 OWNER 列中的值将替换为新所有者的授权标识。
- TABLE table-name
- 标识要转移其所有权的表。 table-name 必须标识数据库中存在的表 (SQLSTATE 42704) ,并且不能标识已声明的临时表 (SQLSTATE 42995)。当转移表的所有权时:
- SYSCAT.TABLES 目录视图将替换为新所有者的授权标识。
- SYSCAT.TABDEP 目录视图将替换为新所有者的授权标识。
无法传输表层次结构中子表的所有权 (SQLSTATE 429BT)。
在联合系统中,可以传输使用透明 DDL 创建的远程表的所有权。 转移远程表的所有权将不会转移与该表相关联的昵称的所有权。 可以使用 TRANSFER OWNERSHIP 语句显式传输此类昵称的所有权。
- TABLE HIERARCHY root-table-name
- 标识要转移其所有权的类型表层次结构中作为根表的类型表。 root-table-name 必须标识作为类型表层次结构中的根表的类型表 (SQLSTATE 428DR) ,并且必须引用数据库中存在的类型表 (SQLSTATE 42704)。当转移表层次结构的所有权时:
- 根表及其在 SYSCAT.TABLES 目录视图将替换为新所有者的授权标识。
- SYSCAT.TABDEP 目录视图将替换为新所有者的授权标识。
- TABLESPACE 表空间名称
- 标识要转移其所有权的表空间。 tablespace-name 必须标识目录中描述的表空间 (SQLSTATE 42704)。
当转移表空间的所有权时, SYSCAT.TABLESPACES 目录视图将替换为新所有者的授权标识。
- TRIGGER trigger-name
- 标识要转移其所有权的触发器。 trigger-name 必须确定在目录中描述的触发器 (SQLSTATE 42704)。
当转移触发器的所有权时, SYSCAT.TRIGGERS 目录视图将替换为新所有者的授权标识。 转移已编译触发器的所有权还会隐式地将关联包的所有权转移给新所有者。
- TYPE type-name
- 标识要转移其所有权的用户定义的类型。 type-name 必须标识目录中描述的类型 (SQLSTATE 42704)。 如果指定了 DISTINCT ,那么 type-name 必须标识目录中描述的单值类型 (SQLSTATE 42704)。
在动态 SQL 语句中,使用 CURRENT SCHEMA 专用寄存器作为未限定的对象名的限定符。 在静态 SQL 语句中,QUALIFIER 预编译或绑定选项隐式地指定未限定的对象名的限定符。
当转移类型的所有权时, SYSCAT.DATATYPES 目录视图将替换为新所有者的授权标识。
- TYPE MAPPING type-mapping-name
- 标识要转移其所有权的用户定义的数据类型映射。 type-mapping-name 必须标识在目录中描述的数据类型映射 (SQLSTATE 42704)。
当转移类型映射的所有权时, SYSCAT.TYPEMAPPINGS 目录视图将替换为新所有者的授权标识。
- VARIABLE variable-name
- 指示要转移其所有权的对象是已创建的全局变量。 variable-name 必须标识 在当前服务器 上存在的全局变量 (SQLSTATE 42704)。
传输全局变量时, SYSCAT.VARIABLES 目录视图将替换为新所有者的授权标识。
- VIEW view-name
- 标识要转移其所有权的视图。 view-name 必须标识数据库中存在的视图 (SQLSTATE 42704)。当转移视图的所有权时:
- SYSCAT.VIEWS 目录视图将替换为新所有者的授权标识。
- SYSCAT.TABDEP 目录视图将替换为新所有者的授权标识。
无法传输视图层次结构中子视图的所有权 (SQLSTATE 429BT)。
- VIEW HIERARCHY root-VIEW-name
- 标识作为要转移其所有权的带类型视图层次结构中的根视图的带类型视图。 root-view-name 必须标识作为带类型视图层次结构 (SQLSTATE 428DR) 中的根视图的带类型视图,并且必须引用数据库中存在的带类型视图 (SQLSTATE 42704)。传输视图层次结构的所有权时:
- SYSCAT.VIEWS 目录视图将替换为新所有者的授权标识。
- OWNER 列中的值用于视图上的所有从属对象及其在 SYSCAT.TABDEP 目录视图将替换为新所有者的授权标识。
- XSROBJECT xsrobject-name
- 标识要转移其所有权的 XSR 对象。 xsrobject-name 必须识别目录中所描述的 XSR 对象 (SQLSTATE 42704)。
传输 XSR 对象的所有权时, SYSCAT.XSROBJECTS 目录视图将替换为新所有者的授权标识。
- 用户
- 指定要将对象所有权转移到的授权标识。
- SESSION_USER
- 指定要将 SESSION_USER 专用寄存器的值用作要将对象所有权转移到的授权标识。
- SYSTEM_USER
- 指定将 SYSTEM_USER 专用寄存器的值用作要将对象所有权转移到的授权标识。
- 撤销特权
- 指示对象的旧所有者将失去对要传输的对象的所有特权。 这是缺省选项。
- 保留特权
- 指定要转移其所有权的对象的当前所有者将在转移后继续持有该对象上的任何现有特权。 例如,创建视图时向该视图的创建者授予的任何特权将继续由原始所有者持有,即使所有权已转移给其他用户也是如此。
规则
- 无法传输大多数内置对象 (所有者为 SYSIBM) 的所有权 (SQLSTATE 42832)。 但是,您可以转移隐式创建的模式对象的所有权,这些对象在 OWNER 列中具有 SYSIBM ,而在 DEFINER 列中没有 SYSIBM。
- 无法传输名称以 "SYS" 开头的模式的所有权 (SQLSTATE 42832)。
- 无法显式传输以下对象的所有权 (SQLSTATE 429BT):
- 表层次结构中的子表 (随根层次结构表一起传输)
- 视图层次结构中的子视图 (随根层次结构视图一起传输)
- 对全局临时表定义的索引
- 创建用户定义类型时隐式生成的方法或函数
- 模块别名和模块
- 依赖于 SQL 过程的程序包 (随 SQL 过程一起传输)
- 处于活动状态的事件监视器 (可以在未处于活动状态时传输这些事件监视器)
- 如果对象还不是其所有者,那么具有 SECADM 权限的授权标识无法将该对象的所有权转移到其自身 (SQLSTATE 42502)。
- 如果任何对象依赖于要撤销的特权,那么使用 REVOKE PRIVILEGES 的变量或序列上的所有权转移将失败 (SQLSTATE 42893)。
- 如果满足以下两个条件,那么在例程上具有 REVOKE PRIVILEGES 的函数上转移所有权将失败 (SQLSTATE 42893)
- 指定的例程用于视图,触发器,约束,索引扩展, SQL 函数, SQL 方法,变换组或作为有源函数的源引用。
- 失去 EXECUTE 特权将导致视图,触发器,约束,索引扩展, SQL 函数, SQL 方法,变换组或有源函数的所有者无法再执行指定的例程。
- 对具有 REVOKE 特权的模块,表,视图,昵称或例程的所有权转移将导致任何从属视图, MQT ,函数,触发器和包被标记为不可用或无效,除非旧所有者具有通过数据库权限或模式权限或通过组,角色或 PUBLIC 撤销的特权。
注意
- 在创建对象过程中授予当前所有者的所有特权都将转移到新所有者。 如果当前所有者已撤销对该对象的特权,并且该特权随后被重新授予,那么不会转移该特权。 对于尚未传输的隐式创建的模式对象,将向新所有者授予对该模式的 CREATEIN , DROPIN 和 ALTERIN 特权,并且还可以仅向其他用户授予这些特权。
- 当转移数据库对象的所有权时,新所有者必须具有对基本对象的一组特权 (由对象的依赖关系指示) ,这些特权是保持对象存在不变所必需的。 如果不需要这些特权来维护对象的存在,那么新所有者不需要创建对象所需的特权。例如:
- 考虑具有对底层表的 SELECT 和 INSERT 依赖关系的视图。 视图的新所有者所拥有的特权必须至少包含 SELECT (具有或不具有 GRANT OPTION) 和 INSERT (具有或不具有 GRANT OPTION) 才能成功进行所有权转移。 如果依赖关系是 SELECT WITH GRANT OPTION 和 INSERT WITH GRANT OPTION ,那么视图的新所有者所拥有的特权必须至少包括 SELECT WITH GRANT OPTION 和 INSERT WITH GRANT OPTION。
- 考虑具有对例程的依赖关系的视图。 视图的新所有者所拥有的特权必须至少包括对从属例程的 EXECUTE 特权。
- 考虑具有对表的依赖关系的触发器。 触发器的新所有者所拥有的特权必须包含触发器的依赖关系所指示的对表的相同特权集。 不需要对定义了触发器的表具有 ALTER 特权。
下表列出了描述其他数据库对象所依赖的对象的目录视图。表 1. 描述其他对象所依赖的对象的目录视图 数据库对象 目录视图 约束 SYSCAT.CONSTDEP 函数 SYSCAT.ROUTINEDEP; SYSCAT.ROUTINES (对于有源函数) INDEX SYSCAT.INDEXDEP INDEX EXTENSION SYSCAT.INDEXEXTENSIONDEP 方法 SYSCAT.ROUTINEDEP PACKAGE SYSCAT.PACKAGEDEP 过程 SYSCAT.ROUTINEDEP 表 SYSCAT.TABDEP TRIGGER SYSCAT.TRIGDEP 视图 SYSCAT.TABDEP Xsrobject SYSCAT.XSROBJECTDEP 如果要成功转移依赖于另一个对象的数据库对象的所有权,那么数据库对象的新所有者必须对该依赖关系的从属对象拥有某些特权:- 如果从属对象是序列,那么新所有者必须对该序列具有 USAGE 特权。
- 如果从属对象是函数,方法或过程,那么新所有者必须对该函数,方法或过程具有 EXECUTE 特权。
- 如果从属对象是程序包,那么新所有者必须对该程序包具有 EXECUTE 特权。
- 如果从属对象是 XSR 对象,那么新所有者必须对该 XSR 对象具有 USAGE 特权。
- 如果尝试将对象的所有权转移给其所有者,那么将返回警告 (SQLSTATE 01676)。
- 无法传输以下数据库对象的所有权,因为这些对象没有所有者: 审计策略, 缓冲池, 角色, 安全标号,安全标号组件,安全策略,服务器,变换函数, 可信上下文, 用户映射和包装器。 请注意, SYSCAT.AUDITPOLICIES和 SYSCAT.BUFFERPOOLS和 SYSCAT.CONTEXTS, SYSCAT.ROLES, SYSCAT.SECURITYLABELS, SYSCAT.SECURITYLABELCOMPONENTS, SYSCAT.SECURITYPOLICIES, SYSCAT.SERVERS和 SYSCAT.TRANSFORMS和 SYSCAT.USEROPTIONS和 SYSCAT.WRAPPERS 目录视图。
- 其所有权已转移的对象的模式名称不会自动更改。
- 语法替代方法: 为了与其他 SQL 语句保持一致:
- 可指定 NODEGROUP 来代替 DATABASE PARTITION GROUP
- 可以指定 SYNONYM 代替 ALIAS
示例
- 示例 1: 将表 T1 的所有权转移到 PAUL。
SYSCAT.TABLES 目录视图中表 WALID.T1 的 OWNER 列中的值将替换为 "PAUL"。 已隐式授予 Paul 对表 WALID.T1 (假定表的先前所有者未丢失对其的任何特权) :CONTROL 和 ALTER , DELETE , INDEX , INSERT , SELECT , UPDATE , REFERENCE (WITH GRANT OPTION)。TRANSFER OWNERSHIP OF TABLE WALID.T1 TO USER PAUL PRESERVE PRIVILEGES - 示例 2: 假定 JOHN 创建表 T1 和 T2,并且 MIKE 具有对表 JOHN.T1 和 JOHN.T2。 MIKE 创建依赖于表 JOHN.T1 和 JOHN.T2的视图 V1 。 将视图 V1 的所有权移交给具有 DBADM 权限的 RY。
SYSCAT.VIEWS 目录视图中视图 V1 的 OWNER 列中的值将替换为 "RY"。 将新行添加到 SYSCAT.TABAUTH : GRANTOR = 'SYSIBM ', GRANTEE = '唐英年 RY' 和 TABNAME = 'V1'。TRANSFER OWNERSHIP OF VIEW V1 TO USER HENRY PRESERVE PRIVILEGES - 示例 3: 假定具有 DBADM 权限的 RY 创建依赖于表 T1的触发器 TR1 。 将触发器 TR1 的所有权移交给不具有 DBADM 权限的 WALID。
即使 Walid 不具有 DBADM 权限,也会成功转移触发器的所有权。TRANSFER OWNERSHIP OF TRIGGER TR1 TO USER WALID PRESERVE PRIVILEGES - 示例 4: 假定 JOHN 创建表 T1 和 T2,并且 MIKE 具有对表 JOHN.T1 和对表 JOHN.T2。 PAUL 拥有对表 JOHN.T1 和 JOHN.T2。 MIKE 创建依赖于表 JOHN.T1 和 JOHN.T2的视图 V1 。 该视图具有 SYSCAT.TABAUTH 中 SELECT 特权的条目,以及表 JOHN.T1 和 JOHN.T2的 SYSCAT.TABDEP 中的两个 SELECT 依赖关系。 将视图 V1 的所有权转移给作为常规用户的 PAUL。
即使 Paul 不具有对表 JOHN.T2。 Paul 只需要对表 JOHN.T1 和 JOHN.T2 以维护视图的存在。 (该视图仅具有 SELECT 特权,因为创建该视图时, Paul 没有对这两个表拥有 CONTROL 特权,因此未授予他对该视图的 CONTROL 特权。) SYSCAT.VIEWS 目录视图中视图 V1 的 OWNER 列中的值将替换为 "PAUL"。 SYSCAT.TABDEP 目录视图中视图 V1 的 OWNER 列中的值将替换为 "PAUL"。 将新行添加到 SYSCAT.TABAUTH : GRANTOR = 'SYSIBM ', GRANTEE = 'PAUL' 和 TABNAME = 'V1'。TRANSFER OWNERSHIP OF VIEW V1 TO USER PAUL PRESERVE PRIVILEGES - 示例 5: 假定 JOHN 创建表 T1,并且 PUBLIC 具有对 JOHN.T1。 PAUL 显式保留对 JOHN.T1 的 SELECT 特权,并创建依赖于表 JOHN.T1的视图 V1 。 将视图 V1 的所有权转移给 MIKE , MIKE 不是 DBADM ,但拥有通过 特殊 组 PUBLIC获取视图所有权所需的特权。
已成功转移视图的所有权,因为 Mike 对表 JOHN.T1 到 PUBLIC。 SYSCAT.VIEWS 目录视图中视图 V1 的 OWNER 列中的值将替换为 "MIKE"。 SYSCAT.TABDEP 目录视图中视图 V1 的 OWNER 列中的值将替换为 "MIKE"。 将新行添加到 SYSCAT.TABAUTH : GRANTOR = 'SYSIBM ', GRANTEE = 'MIKE' 和 TABNAME = 'V1'。TRANSFER OWNERSHIP OF VIEW V1 TO USER MIKE PRESERVE PRIVILEGES - 示例 6: 类似于示例 5 ,假定 JOHN 创建表 T1,并且角色 R1 具有对 JOHN.T1。 PAUL 显式保留对 JOHN.T1 的 SELECT 特权,并创建依赖于表 JOHN.T1的视图 V1 。 将视图 V1 的所有权转移给 MIKE ,该 MIKE 不是 DBADM ,但通过角色 R1 中的成员资格拥有所需特权以获取视图所有权。
已成功转移视图的所有权,因为 Mike 对表 JOHN.T1 (通过角色 R1中的成员资格)。 SYSCAT.VIEWS 目录视图中视图 V1 的 OWNER 列中的值将替换为 "MIKE"。 SYSCAT.TABDEP 目录视图中视图 V1 的 OWNER 列中的值将替换为 "MIKE"。 将新行添加到 SYSCAT.TABAUTH : GRANTOR = 'SYSIBM ', GRANTEE = 'MIKE' 和 TABNAME = 'V1'。TRANSFER OWNERSHIP OF VIEW V1 TO USER MIKE PRESERVE PRIVILEGES
