要为一个或多个会话设置初始环境,创建并安装 sysdbopen() SPL 过程。该过程的典型影响是初始化会话的属性,而不需要在会话中显式定义属性。
如果用户通过不能修改应用程序代码或设置环境选项或环境变量的客户端应用程序访问数据库,则为一个或多个会话设置初始环境非常有用。
只要用户成功发出 DATABASE 或 CONNECT 语句以显式连接到安装了过程的数据库,就会执行 sysdbopen 过程。(但是当连接到本地数据库的用户调用远程 UDR 或执行通过使用 database:object or database@server:object 符号引用远程数据库对象的分布式 DML 操作是,不会在远程数据库中调用 sysdbopen 过程。)
这些过程时一般规则的例外情况,当在与 ANSI 不兼容的数据库中调用例程时, GBase 8s 会忽略 UDR 所有者的名称。对于除 sysdbopen 和 sysdbclose 之外的 UDR ,具有相同的 SQL 标识符但不同所有者名称的 UDR 的多个版本不能在同一数据库中注册,除非创建数据库的 CREATE DATABASE 语句也包括 WITH LOG MODE ANSI 关键字。
还可以创建 sysdbclose SPL 过程,当用户发出 LOSE DATABASE 或 DISCONNECT 语句从数据库断开连接时执行此过程,如果 PUBLIC.sysdbclose 过程已在数据库中注册,并且没有为当前用户注册 user.sysdbclose 过程,则当该用户与数据库断开连接时,将自动执行 PUBLIC.sysdbclose 过程。
CREATE PROCEDURE public.sysdbopen() SET ISOLATION TO REPEATABLE READ; SET ENVIRONMENT OPTCOMPIND '1'; END PROCEDURE;
过程不接受参数和返回值。sysdbopen 和 sysdbclose 过程必须在您希望执行的数据库中注册。DBA 可以创建以下四个类别的 sysdbopen 和 sysdbclose 过程。
如果 CLOSE DATABASE 或 DISCONNECT 语句显式地终止连接,则数据库服务器调用 user.sysdbclose 过程(如果它在数据库中存在)或 public.sysdbclose (如果它存在并且不被用户使用)。如果应用程序在不发出 CLOSE DATABASE 或 DISCONNECT 语句的情况下终止,则数据库服务器强制执行数据库的隐式关闭,并执行 sysdbclose 过程(如果有该名称的 UDR 由用户或 PUBLIC 拥有)。
请确保正确设置文件访问权限,以允许预期用户执行 SPL 过程语句。例如,如果 SPL 过程执行将输出写入本地目录的命令。则必须设置权限以允许用户写入此目录。如果希望在许可失败时继续该过程,请为此条件包含 ON EXCEPTION 错误处理程序。
有关可以出现在 SPL 例程中的 SQL 语句以及有关事务和角色的 SPL 支持的更多信息,请参阅语句块一节。
出于安全原因,非 DBA 无法阻止这些过程的执行。然而,对于一些应用程序,例如 ad hoc 查询应用程序,用户可以执行随后该表环境的命令和 SQL 语句。
sysdbopen 过程中定义的缺省角色优先于用户建立与数据库的连接时用户持有的任何其它角色,其中 sysdbopen 成功地为该用户指定了缺省角色。
由 user.sysdbopen 或 user.sysdbclose 过程中的 DDL 语句创建的任何数据库对象都由连接的用户所有,并且在 PUBLIC.sysdbopen 或 PUBLIC.sysdbclose 内创建的任何对象都由 PUBLIC 用户标识拥有,除非对象名称在 DDL 语句中声明时,被某个其它所有者名称完全限定。
对于兼容 ANSI 的数据库,在 CREATE PROCEDURE 语句的 sysdbopen 或 sysdbclose 定义的末尾需要显式的 COMMIT WORK 语句,以防止 sysdbopen 或 sysdbclose 过程执行的 SQL 语句的任何隐式事务在终止过程时回滚。(省略 COMMIT WORK 语句不会导致连接失败,但会在打开和回滚事务时浪费资源。)
有关这些过程中无效的 SQL 语句的列表,请参阅 SQL 语句在 SPL 语句块中有效。有关在这些过程中有效的 SPL 语句,请参阅 SPL 语句的子集在语句块中有效。
有关如何编写和安装 SPL 过程的一般信息,请参阅 GBase 8s SQL 教程指南中 SPL 例程一节。