可获得性
本特性自MogDB 5.0.6版本开始引入。
特性简介
本特性支持在创建函数、存储过程和包的时候指定AUTHID CURRENT_USER关键字,允许存储过程或函数根据调用者的身份且存储过程或函数的search path也为调用者所在schema,动态地执行SQL语句。
客户价值
增强MogDB与Oracle的兼容性、数据库安全性和灵活性,更好地适应不同用户或角色的权限需求。
特性描述
AUTHID CURRENT_USER是一个关键字,用于指定存储过程、函数、包等的执行权限。当创建函数或存储过程使用AUTHID CURRENT_USER关键字时,函数或存储过程将以当前调用者的身份执行,而不是其存储过程、函数、包等创建者的身份。
举例而言,A/B用户建有一张同名表,在A用户下带AUTHID CURRENT_USER属性创建一个存储过程,并且将该存储过程授权给B用户执行,当A用户执行该存储过程时,数据会插入A的表,B用户执行该存储过程时,数据会插入B的表。
使用AUTHID CURRENT_USER关键字的主要目的是在创建存储过程或函数时,使其具有更灵活的权限控制,以便根据执行者的身份来决定访问权限,根据上下文执行不同的逻辑,而不是强制使用定义者权限。此外,在存储过程或函数中使用DBMS_OUTPUT.PUT_LINE或RAISE INFO等输出信息时,可以通过USER函数获取当前用户的用户名。
此外需要注意的是,behavior_compat_options = 'plsql_security_definer’开关会影响关键字缺省时存储过程、函数、包等的执行权限,若打开此开关,且关键字缺省,则为创建者模式;若关闭此开关,且关键字缺省,则为调用者模式。
语法说明
CREATE [OR REPLACE] {PROCEDURE | FUNCTION | PACKAGE } object_name
[[ EXTERNAL ] SECURITY INVOKER | AUTHID CURRENT_USER]
{IS | AS}
[declaration_section]
BEGIN
-- body_section
END [object_name];
说明:SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
特性约束
- 只支持默认A模式。
- 该关键字需要配合behavior_compat_options = 'set_procedure_current_schema’参数使用。
示例
-- 创建用户并授权
drop user if exists authid_user1 cascade;
drop user if exists authid_user2 cascade;
CREATE USER authid_user1 IDENTIFIED BY 'user1@123';
CREATE USER authid_user2 IDENTIFIED BY 'user2@123';
GRANT ALL PRIVILEGES to authid_user1;
GRANT ALL PRIVILEGES to authid_user2;
-- 切换到用户1,在用户1下创建存储过程
gsql -d postgres -U authid_user1 -W 'user1@123'
create table authid_tab01(col1 integer, col2 integer);
create or replace procedure authid_proc01(val integer) AUTHID CURRENT_USER as
begin
insert into authid_tab01 values(val, val);
raise info 'insert values (%, %)', val, val;
raise info 'current user %', USER;
end;
/
GRANT EXECUTE ON procedure authid_proc01(val in integer) TO authid_user2;
-- 在用户2下创建同名表并调用用户1下的存储过程
gsql -d postgres -U authid_user2 -W 'user2@123'
SET behavior_compat_options = 'set_procedure_current_schema';
create table authid_tab01(col1 integer, col2 integer);
call authid_user1.authid_proc01(2);
-- 查看执行结果
select * from authid_tab01;
col1 | col2
------+------
2 | 2
(1 row)
select * from authid_user1.authid_tab01;
(0 rows)
相关页面
CREATE FUNCTION、CREATE PROCEDURE、CREATE PACKAGE、behavior_compat_options




