设计模式

将数据组织成表时,将表和其他相关对象分组在一起可能会有好处。 为此,须使用 CREATE SCHEMA 语句来定义一个模式。

有关该模式的信息保存在连接的数据库的系统目录表中。 在创建其他对象时,可以将它们置于您创建的模式内,但要注意,一个对象只能存在于一个模式中。

可以将模式比作目录,并且当前模式相当于当前目录。 通过这种类比,SET SCHEMA 相当于 change directory 命令。
重要信息: 了解除缺省 CURRENT SCHEMA 设置 (在以下部分中描述) 外,授权标识和模式之间没有关系很重要。

在设计数据库和表时,还应考虑系统中的模式,包括模式名和将与每个模式关联的对象。

为数据库中的大多数对象指定一个由两部分组成的唯一名称。 第一(最左边的)部分称为限定词或模式,而第二(最右边的)部分称为简单(或未限定)名称。 从句法上来说,这两部分并置成用句点分隔的单个字符串。 第一次创建可以由模式名限定的任何对象(例如,表、索引、视图、用户定义的数据类型、用户定义函数、昵称、程序包或触发器)时,会根据对象名称中的限定词将该对象指定给一个特定模式。

例如,下图说明了在表创建过程中如何将表分配给特定模式:
如何将表对象分配给模式

您还应该了解如何授予模式访问权,以便为用户授予正确的权限并提供指示信息:

模式名
在创建新模式时,名称不能标识目录中已描述的模式名,并且不能以“SYS”开头。 有关其他限制和建议,请参阅 模式名称限制和建议
访问模式

由于使用模式来强制数据库中的唯一性,所以不允许对模式内的对象的非限定访问。 当考虑两个用户有可能使用同一名称创建两个表(或其他对象)时,这一点变得很清楚。 没有模式来强制唯一性时,若第三个用户试图查询该表,将会造成不明确。 没有进一步的限定时,不可能确定要使用哪一个表。

作为 CREATE SCHEMA 语句的一部分创建的任何对象的定义者是模式所有者。 此所有者可以授予和撤销其他用户的模式特权。

如果用户具有 DBADM 权限,那么该用户可以创建具有任何有效名称的模式。 当创建数据库时,会将 IMPLICIT_SCHEMA 权限授予 PUBLIC(即,授予所有用户)。

如果用户没有 IMPLICIT_SCHEMA 或 DBADM 权限,那么他们可以创建的唯一模式是具有与他们自己的授权标识同名的模式。

缺省模式

如果未将模式或限定符指定为要创建的对象名的一部分,那么该对象将指定给 CURRENT SCHEMA 专用寄存器中所指示的缺省模式。 此专用寄存器的缺省值是会话授权标识的值。

动态语句中的未限定对象引用需要缺省模式。 您可以通过将 CURRENT SCHEMA 专用寄存器设置为要作为缺省值的模式,为特定 Db2® 连接设置缺省模式。 不需要指定的权限来设置此专用寄存器,因此任何用户都可以设置 CURRENT SCHEMA。

SET SCHEMA 语句的语法如下:
    SET SCHEMA = <schema-name>
可采用交互方式或从应用程序中发出此语句。 CURRENT SCHEMA 专用寄存器的初始值等于当前会话用户的授权标识。 有关更多信息,请参阅 SET SCHEMA 语句。
注:
  • 可使用其他方法来在连接时设置缺省模式。 例如,通过对 CLI/ODBC 应用程序使用 cli.ini 文件,或者通过对 JDBC 应用程序编程接口使用连接属性。
  • 缺省模式记录不是在系统目录中创建的,但只要未将模式或限定符指定为要创建的对象名的一部分,该记录就只作为数据库管理器可以从 CURRENT SCHEMA 专用寄存器获取的值存在。
隐式创建

如果您具有 IMPLICIT_SCHEMA 权限,那么可以隐式创建模式。 只要具有此权限,无论您何时使用不存在的模式名创建对象,都会隐式创建一个模式。 只要创建对象的用户拥有 IMPLICIT_SCHEMA 权限,通常会在第一次创建模式中的数据对象时隐式创建模式。

显式创建

还可以通过在命令行或应用程序中执行 CREATE SCHEMA 和 DROP SCHEMA 语句来显式创建和删除模式。 有关更多信息,请参阅 CREATE SCHEMA 和 DROP SCHEMA 语句。

按模式分组的表和视图别名

要允许另一个用户访问表或视图而不必输入模式名作为表名或视图名的限定部分,需要为该用户建立别名。 别名定义将定义包括用户模式的标准表名或视图名;然后用户将需要使用别名进行查询。 将通过作为别名定义一部分的用户模式对别名进行全限定。