KingabseES例程-函数和过程的 INVOKER 与 DEFINER
调用者权利和定义者权利子句
指定子程序的权利属性。权利属性影响单元在运行时,执行的SQL语句的名称解析和权限检查。
PG模式:
SECURITY INVOKER
SECURITY DEFINER
Oracle模式:
AUTHID CURRENT_USER
AUTHID DEFINER
一、测试KingbaseES 的PG 模式
数据准备
创建用户:2个普通用户,1个superuser用户
create user u01 password '123456';
create schema authorization u01;
create user u02 password '123456';
create schema authorization u02;
create user u03 password '123456' superuser ;
create schema authorization u03;
每个用户创建同名表,插入数据:用户名
create table u01.t_user as select 'U01' as name ;
create table u02.t_user as select 'U02' as name ;
create table u03.t_user as select 'U03' as name ;
alter table u01.t_user owner to u01;
alter table u02.t_user owner to u02;
alter table u03.t_user owner to u03;
用户U01创建函数,分别使用不同的权利属性。
默认权利模式是定义者-INVOKER。
函数中,T_USER表名不含SCHEMA。
CREATE OR REPLACE function u01.TEST_default()
returns text
language plpgsql
AS
$$
declare
v1 text;
BEGIN
select name into v1 from t_user;
return v1;
END ;
$$; CREATE OR REPLACE function u01.TEST_definer()
returns text
language plpgsql
SECURITY DEFINER
AS
$$
declare
v1 text;
BEGIN
select name into v1 from t_user;
return v1;
END ;
$$; CREATE OR REPLACE function u01.TEST_INVOKER()
returns text
language plpgsql
SECURITY INVOKER
AS
$$
declare
v1 text;
BEGIN
select name into v1 from t_user;
return v1;
END ;
$$; select proname
, case when prosecdef then 'DEFINER' else 'INVOKER' end prosecdef
, (select lanname from pg_language where oid = prolang)
from pg_proc
where pronamespace = 'u01'::regnamespace;
proname | prosecdef | lanname
--------------+-----------+---------
test_default | INVOKER | plpgsql
test_definer | DEFINER | plpgsql
test_invoker | INVOKER | plpgsql
使用U03 (superuser)用户测试
u03用户拥有同名表
$ ksql -U u03 -d kingbase <<EOF
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' CURRENT_USER: ' || U01.TEST_invoker();
EOF name
-----------------------
u03 DEFAULT : U03
u03 DEFINER : U01
u03 CURRENT_USER: U03
(3 行记录)u03用户没有有同名表
U01.TEST_default 和 U01.TEST_invoker 函数报错,不能在用户u03找到 t_user 表。
$ ksql -U u03 -d kingbase <<EOF
drop table u03.t_user;
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' CURRENT_USER: ' || U01.TEST_invoker();
EOF DROP TABLE
错误: 关系 "t_user" 不存在
第1行select name from t_user
^
查询: select name from t_user
背景: 在SQL语句的第5行的PL/pgSQL函数u01.test_default() $ ksql -U u01 -d kingbase <<EOF
select user || ' DEFINER : ' || U01.TEST_definer() ;
EOF ?column?
-----------------------
u03 DEFINER : U01
(1 行记录)
使用u02 普通用户测试
u02拥有同名表
USAGE ON SCHEMA u01,需要赋权给普通用户。
$ ksql -U u02 -d kingbase <<EOF
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' CURRENT_USER: ' || U01.TEST_invoker();
EOF
name
-----------------------
u02 DEFAULT : U02
u02 DEFINER : U01
u02 CURRENT_USER: U02
(3 rows)u02没有同名表
U01.TEST_default 和 U01.TEST_invoker 函数报错,不能在用户u02找到 t_user 表。
$ ksql -U u02 -d kingbase <<EOF
drop table u02.t_user;
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' CURRENT_USER: ' || U01.TEST_invoker();
EOF DROP TABLE
错误: 关系 "t_user" 不存在
LINE 1: select name from t_user
^
QUERY: select name from t_user
CONTEXT: 在SQL语句的第5行的PL/pgSQL函数u01.test_default() $ ksql -U u02 -d kingbase <<EOF
select user || ' DEFINER : ' || U01.TEST_definer() ;
EOF ?column?
-----------------------
u02 DEFINER : U01
(1 row)
二、测试KingbaseES的Oracle模式
数据准备
创建用户:2个普通用户,1个superuser用户
create user u01 password '123456';
create schema authorization u01;
create user u02 password '123456';
create schema authorization u02;
create user u03 password '123456' superuser ;
create schema authorization u03;
每个用户创建同名表,插入数据:用户名
create table u01.t_user as select 'U01' as name ;
create table u02.t_user as select 'U02' as name ;
create table u03.t_user as select 'U03' as name ;
alter table u01.t_user owner to u01;
alter table u02.t_user owner to u02;
alter table u03.t_user owner to u03;
用户U01创建函数,分别使用不同的AUTHID属性。
默认权利模式是定义者-INVOKER。
函数中,T_USER表名不含SCHEMA。
$ ksql -U u01 -d kingbase <<EOF
\set SQLTERM /
CREATE OR REPLACE function U01.TEST_default
return varchar2
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/ CREATE OR REPLACE function U01.TEST_invoker
return varchar2
AUTHID CURRENT_USER
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/ CREATE OR REPLACE function U01.TEST_definer
return varchar2
AUTHID definer
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/
EOF CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION select proname
, case when prosecdef then 'DEFINER' else 'INVOKER' end prosecdef
, (select lanname from pg_language where oid = prolang)
from pg_proc
where pronamespace = 'u01'::regnamespace; proname | prosecdef | lanname
-------------------+-----------+---------
test_default | INVOKER | plsql
test_invoker | INVOKER | plsql
test_definer | DEFINER | plsql
(3 rows)
使用u03(superuser)用户测试
u03 用户拥有同名表
$ ksql -U u03 -d kingbase <<EOF
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' INVOKER : ' || U01.test_invoker();
EOF
name
-----------------------
u03 DEFAULT : U01
u03 DEFINER : U01
u03 INVOKER : U01
(3 rows)u03 用户没有同名表
$ ksql -U u03 -d kingbase <<EOF
drop table u03.t_user;
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' INVOKER : ' || U01.test_invoker();
EOF
DROP TABLE
name
-----------------------
u03 DEFAULT : U01
u03 DEFINER : U01
u03 INVOKER : U01
(3 rows)
使用普通用户测试
普通用户拥有同名表
SELECT ON u01.t_user,需要赋权给普通用户。
USAGE ON SCHEMA u01,需要赋权给普通用户。
$ ksql -U u02 -d kingbase <<EOF
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' INVOKER : ' || U01.test_invoker();
EOF
name
-----------------------
u02 DEFAULT : U01
u02 DEFINER : U01
u02 INVOKER : U01
(3 rows)普通用户没有同名表
$ ksql -U u02 -d kingbase <<EOF
drop table u02.t_user;
select user || ' DEFAULT : ' || U01.TEST_default() as name
union all
select user || ' DEFINER : ' || U01.TEST_definer()
union all
select user || ' INVOKER : ' || U01.test_invoker();
EOF
name
-----------------------
u02 DEFAULT : U01
u02 DEFINER : U01
u02 INVOKER : U01
(3 rows)
三、测试Oracle规则
数据准备
创建用户:2个普通用户,1个DBA用户
create user u01 identified by 123456;
grant connect,resource,unlimited tablespace to u01;
create user u02 identified by 123456;
grant connect,resource,unlimited tablespace to u02;
create user u03 identified by 123456;
grant dba to u03;
每个用户创建同名表,插入数据:用户名
create table u01.t_user as select 'U01' as name from dual;
create table u02.t_user as select 'U02' as name from dual;
create table u03.t_user as select 'U03' as name from dual;
用户U01创建函数,分别使用不同的AUTHID属性。
默认权利模式是定义者-DEFINER。
函数中,T_USER表名不含SCHEMA。
CREATE OR REPLACE function U01.TEST_default
return varchar2
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/ CREATE OR REPLACE function U01.TEST_CURRENT_USER
return varchar2
AUTHID CURRENT_USER
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/ CREATE OR REPLACE function U01.TEST_definer
return varchar2
AUTHID definer
AS
v1 varchar2(10);
BEGIN
select name into v1 from t_user;
return v1;
END ;
/ select OBJECT_NAME,AUTHID from SYS.DBA_PROCEDURES
where OWNER='U01'; OBJECT_NAME AUTHID
--------------- ---------
TEST_DEFAULT DEFINER
TEST_CURRENT_USER CURRENT_USER
TEST_DEFINER DEFINER
使用DBA用户测试
DBA用户拥有同名表
$ sqlplus -S u03/123456 <<EOF
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual union all
select user||' CURRENT_USER: '||U01.TEST_CURRENT_USER() from dual;
EOF NAME
---------------------
U03 DEFAULT : U01
U03 DEFINER : U01
U03 CURRENT_USER: U03DBA用户没有同名表
CURRENT_USER:由于调用者用户没有同名表,所以报错:ORA-00942: table or view does not exist 。
$ sqlplus -S u03/123456 <<EOF
drop table u03.t_user purge;
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual union all
select user||' CURRENT_USER: '||U01.TEST_CURRENT_USER() from dual;
EOF Table dropped. ERROR:
ORA-00942: table or view does not exist
ORA-06512: at "U01.TEST_CURRENT_USER", line 7 $ sqlplus -S u03/123456 <<EOF
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual ;
EOF NAME
---------------------
U03 DEFAULT : U01
U03 DEFINER : U01
使用普通用户测试
普通用户拥有同名表
需要赋权给普通用户。
$ sqlplus -S u03/123456 <<EOF
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual union all
select user||' CURRENT_USER: '||U01.TEST_CURRENT_USER() from dual;
EOF
ERROR:
ORA-00942: table or view does not exist
ORA-06512: at "U01.TEST_CURRENT_USER", line 7 no rows selected $ sqlplus -S u01/123456 <<EOF
grant execute on u01.TEST_DEFAULT to u02;
grant execute on u01.TEST_DEFINER to u02;
grant execute on u01.TEST_CURRENT_USER to u02;
EOF Grant succeeded. Grant succeeded. Grant succeeded. $ sqlplus -S u02/123456 <<EOF
drop table u02.t_user purge;
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual union all
select user||' CURRENT_USER: '||U01.TEST_CURRENT_USER() from dual;
EOF NAME
---------------------
U02 DEFAULT : U01
U02 DEFINER : U01
U02 CURRENT_USER: U02普通用户没有同名表
$ sqlplus -S u02/123456 <<EOF
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual union all
select user||' CURRENT_USER: '||U01.TEST_CURRENT_USER() from dual;
EOF Table dropped. ERROR:
ORA-00942: table or view does not exist
ORA-06512: at "U01.TEST_CURRENT_USER", line 7 no rows selected $ sqlplus -S u02/123456 <<EOF
select user||' DEFAULT : '||U01.TEST_default() as name from dual union all
select user||' DEFINER : '||U01.TEST_definer() from dual ;
EOF NAME
---------------------
U02 DEFAULT : U01
U02 DEFINER : U01
总结
程序权利属性列表
| PG模式 | Oracle模式 | Oracle规则 | |
|---|---|---|---|
| 权利属性子句 | SECURITY INVOKER|DEFINER | AUTHID CURRENT_USER|DEFINER | AUTHID CURRENT_USER|DEFINER |
| 默认属性 | INVOKER | INVOKER | DEFINER |
| 权限需求 | USAGE ON SCHEMA | USAGE ON SCHEMA & SELECT ON table_name | EXECUTE ON function_name |
| DEFINER | 根据定义者解析表名 | 根据定义者解析表名 | 根据定义者解析表名 |
| INVOKER | 根据调用者解析表名 | 根据定义者解析表名 | 根据调用者解析表名 |
KingabseES例程-函数和过程的 INVOKER 与 DEFINER的更多相关文章
- PL/SQL --> 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- .Net程序员学用Oracle系列(7):视图、函数、过程、包
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...
- 变量、&连接、函数与过程、按下某键
1.变量的声明 常量 信息 为 文本型 = "你好,世界!" '这是常量 变量 结果 为 整数型 '这是程序集变量,在程序集的开头定义即可 变量 测试 为 整数型 = '可以直接给 ...
- mysql自定义函数与过程中写法的注意事项
BEGIN #Routine body goes here... /* update szzx_goods_common set gc_id=i where gc_name=(SELECT gc_na ...
- 【Oracle】Oracle自定义的函数与过程
本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1创建过程 6.3.2调用存储过程 6.3.3 AUTHID 6.3.4 PRAGMA AUTONOMOUS_TRANSA ...
- oracle中使用函数控制过程是否执行(结合job使用)
oracle中使用函数控制过程是否执行(结合job使用时候,循环时间不好写的时候,可以此种方法比较方便) CREATE OR REPLACE FUNCTION wsbs_pk_date_validat ...
- MySql创建函数与过程,触发器, shell脚本与sql的相互调用。
一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...
- oracle数据库之存储函数和过程
一.引言 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...
- JS,Javascript加载与函数执行过程
Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...
- JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程
壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...
随机推荐
- flask+xlswriter+axios导出Excel
flask后端 starttime = request.json.get('starttime') endtime = request.json.get('endtime') # 根据时间查询数据库数 ...
- ORACLE SEQUENCE 详解
1. About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用. 序列消除了串行 ...
- CSS实现导航栏
1.知识点 列表 浮动 伪类 背景 文本格式化 盒子模型 2.效果 3.代码 <!DOCTYPE html> <html lang="en"> <he ...
- 【Android逆向】脱壳项目 frida-dexdump 原理分析
1. 项目代码地址 https://github.com/hluwa/frida-dexdump 2. 核心逻辑为 def dump(self): logger.info("[+] Sear ...
- 【LeetCode二叉树#14】验证二叉搜索树(巩固迭代中序遍历#1)
验证二叉搜索树 力扣题目链接(opens new window) 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子 ...
- 【Azure API 管理】Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错
问题描述 Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错,是否有其他可以对URL解码的方法呢? 使用H ...
- nmcli命令详解(创建热点,连接wifi,管理连接等)
目录 简述 语法 比较有用的选项(OPTION) 对象 general对象(常规信息) 用途 语法 networking对象(整个网络) 用途 语法 命令示例 radio对象(无线开关) 用途 语法 ...
- 图查询语言 nGQL 简明教程 vol.01 快速入门
本文旨在让新手快速了解 nGQL,掌握方向,之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询. 视频 本教程的视频版在B站这里. 准备工作 在正式开始 nGQL 实操之前,记得 ...
- shell脚本的基本使用
本文是对菜鸟教程 shell编程原文 的总结并记录 如有侵权 联系删除 简介 说明: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.这个应用程序提供了一个界面,用户通过这 ...
- Java与sql中的字符串表示
在 Java 中,双引号 "" 用于表示字符串字面量,而单引号 '' 用于表示字符字面量.这意味着在 Java 中,您可以使用双引号来包围包含任意数量字符的字符串,包括零个字符(空 ...