#PL对象
PL对象是基于PL语言按语法规则组织的一种数据库对象,如存储过程、匿名块、自定义函数等。
一个典型的PL对象的结构为:
头部
IS/AS
过程体
其中,头部包含名称、参数、返回类型等内容;过程体则是实现PL语言的主要载体,主要包括如下内容:
- 变量定义及管理
- 运算
- 控制
- 传递(变量、参数)
- 特有的数据处理
# 创建PL对象
包括对PL对象的定义和编译。
对PL对象的定义是通过编写PL语言来描述其结构的过程。
对PL对象的编译是使用YashanDB的编译器对上面定义的内容进行分析、翻译等操作后生成可执行代码的过程。
对于使用CREATE PROCEDURE、CREATE FUNCTION等SQL语句创建的PL对象,其在创建后将被保存在数据库中,即对其实现持久化。
对于只有过程体,无对象名称和参数定义,不需要通过SQL语句创建的PL对象,如匿名块,其在创建后不会保存,而是直接运行。
# 运行PL对象
当匿名块创建后,或者当持久化的PL对象被调用(在SQL或PL内部调用,或通过CALL/EXEC等SQL语句调用)时,YashanDB的执行器将会找到该对象编译好的代码体并运行,执行各类PL语句所定义的操作,生成结果返回,或者抛出异常。
# 删除PL对象
对于不再使用的PL对象,可通过DROP PROCEDURE、DROP FUNCTION等SQL语句将其从数据库中删除。
# 重编译PL对象
通过ALTER FUNCTION、ALTER PACKAGE、ALTER PROCEDURE、ALTER 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::=
在定义一个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模式执行权限检查。