#PL对象

PL对象是基于PL语言按语法规则组织的一种数据库对象,如存储过程、匿名块、自定义函数等。

一个典型的PL对象的结构为:

头部

IS/AS

过程体

其中,头部包含名称、参数、返回类型等内容;过程体则是实现PL语言的主要载体,主要包括如下内容:

  • 变量定义及管理
  • 运算
  • 控制
  • 传递(变量、参数)
  • 特有的数据处理

# 创建PL对象

包括对PL对象的定义和编译。

对PL对象的定义是通过编写PL语言来描述其结构的过程。

对PL对象的编译是使用YashanDB的编译器对上面定义的内容进行分析、翻译等操作后生成可执行代码的过程。

对于使用CREATE PROCEDURECREATE FUNCTION等SQL语句创建的PL对象,其在创建后将被保存在数据库中,即对其实现持久化。

对于只有过程体,无对象名称和参数定义,不需要通过SQL语句创建的PL对象,如匿名块,其在创建后不会保存,而是直接运行。

# 运行PL对象

当匿名块创建后,或者当持久化的PL对象被调用(在SQL或PL内部调用,或通过CALL/EXEC等SQL语句调用)时,YashanDB的执行器将会找到该对象编译好的代码体并运行,执行各类PL语句所定义的操作,生成结果返回,或者抛出异常。

# 删除PL对象

对于不再使用的PL对象,可通过DROP PROCEDUREDROP FUNCTION等SQL语句将其从数据库中删除。

# 重编译PL对象

通过ALTER FUNCTIONALTER PACKAGEALTER PROCEDUREALTER TRIGGER等SQL语句,可以对自定义函数、自定义高级包、存储过程、触发器等进行重编译。

如果重编译的对象有任何依赖的对象失效,系统将首先重编译这些依赖的对象。

对一个PL对象重编译成功后,该对象将被置为有效状态。如果重编译失败,系统返回相应报错,该对象变为无效状态,且系统会同时失效依赖于该对象的其他对象。

# PL对象权限控制

YashanDB通过一套系统权限机制(见产品安全手册系统权限管理)对PL对象的创建和使用进行安全控制,具体包括如下权限:

  • CREATE/DROP PROCEDURE:创建/删除存储过程、函数、高级包、类型的权限。
  • CREATE/ALTER/DROP ANY PROCEDURE:创建/修改/删除所有用户(sys用户除外)下的存储过程、函数、高级包、类型的权限。
  • EXECUTE ANY PROCEDURE:执行所有用户(sys用户除外)下的存储过程、函数、高级包的权限。
  • CREATE TRIGGER:创建/修改/删除触发器的权限。
  • CREATE/ALTER/DROP TRIGGER:创建/修改/删除所有用户(sys用户除外)下的触发器的权限。
  • ADMINISTER DATABASE TRIGGER:管理数据库级别触发器的权限。
  • CREATE/DROP TYPE:创建/删除自定义类型。
  • CREATE/ALTER/DROP ANY TYPE:创建/修改/删除所有用户(sys用户除外)下的自定义类型。
  • EXECUTE ANY TYPE:执行所有用户(sys用户除外)下的自定义类型。
  • UNDER ANY TYPE: 在非最终的OBJECT类型下创建子类型。

# invoker_rights_clause

上述权限定义了某个用户对PL对象的权限,该用户可能是PL对象的所属用户,或者为调用PL执行的用户。由于PL过程体中存在SQL语句,相应地会存在执行SQL时的权限检查。

invoker_rights_clause用于在定义PL对象时同时定义其AUTHID属性,指定此种情形下的执行权限模式。

invoker_rights_clause::=

syntax
AUTHID CURRENT_USER DEFINER

在定义一个PL对象的语句中,invoker_rights_clause子句只能出现一次。

在独立的存储过程、函数中用于指定该对象的AUTHID属性。

在高级包中用于指定该高级包下所有子程序的AUTHID属性。

在类型中只用于指定Object UDT的方法的AUTHID属性,不能在定义Varray/Table UDT时指定,且子类型必须与父类型指定相同的AUTHID属性。

定义匿名块和触发器时不能使用本语句,而是采用固定的AUTHID属性:

  • 匿名块的AUTHID属性为CURRENT_USER
  • 触发器的AUTHID属性为DEFINER

# current_user

表示过程体执行时的默认模式是调用PL对象的用户,且对该用户执行过程体中SQL语句的权限检查。

# definer

默认行为。表示过程体中在执行时的默认模式是PL对象所属的用户,且对该用户执行过程体中SQL语句的权限检查。

Note

通过dba/all/USER_PROCEDURES视图可查看PL对象的执行权限模式(AUTHID属性)。

CURRENT_USER当前为语法兼容模式,即无论是否指定AUTHID属性,系统均按DEFINER模式执行权限检查。