CREATE ALIAS 语句

CREATE ALIAS 语句定义模块,昵称,序列,表,视图或其他别名的别名。 别名也称为同义词。

调用

此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

权限

语句授权标识所拥有的特权必须至少包括下列其中一项权限:
  • 数据库上的 IMPLICIT_SCHEMA 权限 (如果别名的隐式或显式模式名不存在)
  • 对模式的 SCHEMAADM 权限 (如果别名的模式名称引用现有模式)
  • 对模式的 CREATEIN 特权 (如果别名的模式名称引用现有模式) 或对SY溅射的 CREATEIN 特权 (如果正在创建公用别名) (如果正在创建公用别名)
  • DBADM 权限

通过其别名使用所引用对象所需的特权与直接使用该对象所需的特权相同。

要替换现有别名,语句的授权标识必须是现有别名的所有者 (SQLSTATE 42501)。

语法

Read syntax diagramSkip visual syntax diagramCREATE OR REPLACE PUBLIC ALIAStable-aliasmodule-aliassequence-alias
table-alias
Read syntax diagramSkip visual syntax diagramalias-nameFORTABLEtable-nameview-namenicknamealias-name2
module-alias
Read syntax diagramSkip visual syntax diagramalias-nameFORMODULE module-namealias-name2
sequence-alias
Read syntax diagramSkip visual syntax diagramalias-nameFORSEQUENCE sequence-namealias-name2

描述

OR REPLACE
如果当前服务器上存在别名,那么指定替换该别名的定义。 在目录中替换新定义之前,将有效地删除现有定义。 如果当前服务器上不存在别名的定义,那么将忽略此选项。 此选项只能由对象所有者指定。
PUBLIC
指定别名是系统模式SY溅射中的对象。
别名
命名别名。 对于表别名,该名称不得标识当前服务器上存在的昵称,表,视图或表别名。 对于模块别名,该名称不得标识当前服务器上存在的模块或模块别名。 对于序列别名,该名称不得标识当前服务器上存在的序列或序列别名。

如果指定了两部分名称,那么模式名称不能以 "SYS" 开头 (SQLSTATE 42939) ,但如果指定了 PUBLIC ,那么模式名称必须是SY有所余 (SQLSTATE 428EK)。

FOR TABLE table-name , view-name , nickname , alias-name2
标识为其定义了 alias-name 的表,视图,昵称或表别名。 如果提供了另一个别名 (alias-name2) ,那么它不能与正在定义的新 alias-name (其标准格式) 相同。 table-name 不能是已声明的临时表 (SQLSTATE 42995)。
FOR MODULE module-name alias-name2
标识为其定义了 alias-name 的模块或模块别名。 如果提供了另一个别名 (alias-name2) ,那么它不能与正在定义的新别名 (以其标准格式) 相同。
FOR SEQUENCE sequence-name alias-name2
标识为其定义了 alias-name 的序列或序列别名。 如果提供了另一个别名 (alias-name2) ,那么它不能与正在定义的新 alias-name (其标准格式) 相同。 sequence-name 不得是系统为标识列生成的序列 (SQLSTATE 428FB)。

注意

  • 关键字 PUBLIC 用于创建公用别名 (也称为公用同义词)。 如果未使用关键字 PUBLIC ,那么别名类型为专用别名 (也称为专用同义词)。
  • 公共别名仅可在 SQL 语句中与装入实用程序配合使用。
  • 新创建的表别名的定义存储在 SYSCAT.TABLES。 新创建的模块别名的定义存储在 SYSCAT.MODULES。 新创建的序列别名的定义存储在 SYSCAT.SEQUENCES中。
  • 可以为定义时不存在的对象定义别名。 如果它不存在,那么将发出警告 (SQLSTATE 01522)。 但是,当编译包含别名的 SQL 语句时,引用的对象必须存在,否则将发出错误 (SQLSTATE 52004)。
  • 可以定义别名以将另一别名作为别名链的一部分来引用,但此链在 SQL 语句中使用时受与单个别名相同的限制。 别名链的解析方式与单个别名相同。 如果在程序包中的语句, SQL 例程,触发器,全局变量的缺省表达式或视图定义中使用的别名指向别名链,那么将针对该程序包, SQL 例程,触发器,全局变量或该链中每个别名的视图记录依赖关系。 别名不能在别名链中引用自身,并且在别名定义时检测到此类循环 (SQLSTATE 42916)。
  • 解析未限定的别名: 解析未限定的名称时,将在公用别名之前考虑专用别名。
  • 公用别名的保守绑定: 如果在程序包, SQL 例程,触发器,全局变量的缺省表达式或视图定义中的语句中使用公用别名,那么这些对象将继续使用公用别名,而不管随后创建的是具有相同名称的其他对象。
  • 使用尚不存在的模式名创建别名将导致隐式创建该模式,前提是该语句的授权标识具有 IMPLICIT_SCHEMA 权限。 模式所有者是 SYSIBM。 该模式上的 CREATEIN 特权会授予 PUBLIC。
  • 语法替代方法: 为了与先前版本的 Db2® 和其他数据库产品兼容,支持以下语法替代方法。
    • 可以指定 SYNONYM 代替 ALIAS

示例

  • 示例 1: HEDGES 尝试为表 T1 (两者都未限定) 创建别名。
      
       CREATE ALIAS A1 FOR T1
    将为 HEDGES.T1创建别名 HEDGES.A1 。
  • 示例 2: HEDGES 尝试为表创建别名 (两者都是限定的)。
       CREATE ALIAS HEDGES.A1 FOR MCKNIGHT.T1
    将为 MCKNIGHT.T1创建别名 HEDGES.A1 。
  • 示例 3: HEDGES 尝试为表创建别名 (其他模式中的别名 ;HEDGES 不是 DBADM; HEDGES 在模式 MCKNIGHT 上没有 CREATEIN)。
       CREATE ALIAS  MCKNIGHT.A1 FOR MCKNIGHT.T1
    此示例失败 (SQLSTATE 42501)。
  • 示例 4: HEDGES 尝试为未定义的表 (两者都是限定的; FUZZY.WUZZY 不存在)。
       CREATE ALIAS HEDGES.A1 FOR FUZZY.WUZZY
    此语句成功但有警告 (SQLSTATE 01522)。
  • 示例 5: HEDGES 尝试为别名创建别名 (两者都是限定的)。
       CREATE ALIAS HEDGES.A1 FOR MCKNIGHT.T1
       CREATE ALIAS HEDGES.A2 FOR HEDGES.A1

    第一个语句成功 (如示例 2)。

    第二个语句成功,将创建由 HEDGES.A2 指的是 HEDGES.A1 指的是 MCKNIGHT.T1。 请注意, HEDGES 在 MCKNIGHT.T1。 将创建别名,而不考虑表特权。

  • 示例 6: 将 A1 指定为昵称FUZZY熊的别名。
       CREATE ALIAS A1 FOR FUZZYBEAR 
  • 示例 7: 大型组织具有编号为 D108 的财务部门和编号为 D577的人事部门。 D108 将某些信息保留在位于 Db2 RDBMS 上的表中。 D577 将某些记录保留在位于 Oracle RDBMS 上的表中。 DBA 将这两个 RDBMS 定义为联合系统中的数据源,并分别为表提供 DEPTD108 和 DEPTD577的昵称。 联合系统用户需要在这些表之间创建连接,但希望通过比其字母数字昵称更有意义的名称来引用这些表。 因此,用户将 FINANCE 定义为 $TAG1 DEPTD108 $TAG2 的别名,将人事定义为 DEPTD577的别名。
       CREATE ALIAS FINANCE FOR DEPTD108
       CREATE ALIAS PERSONNEL FOR DEPTD577
  • 示例 8: 为目录视图 SYSCAT.TABLES。
    
       CREATE PUBLIC ALIAS TABS FOR SYSCAT.TABLES