首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Oracle中已定义者身份执行函数AUTHID DEFINER与Postgresql行为的异同

Oracle中已定义者身份执行函数AUTHID DEFINER与Postgresql行为的异同

作者头像
mingjie
发布2022-07-01 13:46:52
发布2022-07-01 13:46:52
1.2K0
举报

Oracle行为

Oracle中函数可以定义执行函数体时,使用哪个用户的权限:

代码语言:javascript
复制
[AUTHID { CURRENT_USER|DEFINER}]

CURRENT_USER已当前用户身份执行函数体
DEFINER已定义者的身份执行函数体

CASE1:例如下面函数会使用当前用户执行函数体,如果当前用户对tbl1读权限就可以成功执行。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE TEST_P AUTHID CURRENT_USER IS
BEGIN
    EXECUTE IMMEDIATE 'select * from tbl1';
END TEST_P;

CASE2:下面函数会使用定义函数的用户执行函数体,如果定义函数的用户对tbl1读权限就可以成功执行。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE TEST_P AUTHID DEFINER IS
BEGIN
    EXECUTE IMMEDIATE 'select * from tbl1';
END TEST_P;

PG 行为

PG中执行函数永远是使用当前用户的权限来执行的,类似Oracle中AUTHID CURRENT_USER的概念。

例如user1创建表

代码语言:javascript
复制
drop table u1tbl;
create table u1tbl(i int);
insert into u1tbl values (123);

user2无权限查询

代码语言:javascript
复制
postgres=> select * from u1tbl;
ERROR:  permission denied for table u1tbl

user1创建函数

代码语言:javascript
复制
drop function f1();
CREATE OR REPLACE FUNCTION f1() RETURNS int AS $$
DECLARE
	id int;
BEGIN
	select i into id from u1tbl;
	return id;
END;
$$ LANGUAGE plpgsql;

user2执行函数

代码语言:javascript
复制
postgres=> select f1();
ERROR:  permission denied for table u1tbl
CONTEXT:  SQL statement "select i         from u1tbl"
PL/pgSQL function f1() line 5 at SQL statement

可见PG中并没有提供已定义者身份执行的这种方式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Oracle行为
  • PG 行为
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档