文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持AUTHID CURRENT_USER

可获得性

本特性自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 FUNCTIONCREATE PROCEDURECREATE PACKAGEbehavior_compat_options

Copyright © 2011-2024 www.enmotech.com All rights reserved.