调用者权利和定义者权利子句

指定子程序的权利属性。权利属性影响单元在运行时,执行的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: U03
  • DBA用户没有同名表

    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的更多相关文章

  1. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  2. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  3. 变量、&连接、函数与过程、按下某键

    1.变量的声明 常量 信息 为 文本型 = "你好,世界!" '这是常量 变量 结果 为 整数型 '这是程序集变量,在程序集的开头定义即可 变量 测试 为 整数型 = '可以直接给 ...

  4. mysql自定义函数与过程中写法的注意事项

    BEGIN #Routine body goes here... /* update szzx_goods_common set gc_id=i where gc_name=(SELECT gc_na ...

  5. 【Oracle】Oracle自定义的函数与过程

    本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1创建过程 6.3.2调用存储过程 6.3.3 AUTHID 6.3.4 PRAGMA AUTONOMOUS_TRANSA ...

  6. oracle中使用函数控制过程是否执行(结合job使用)

    oracle中使用函数控制过程是否执行(结合job使用时候,循环时间不好写的时候,可以此种方法比较方便) CREATE OR REPLACE FUNCTION wsbs_pk_date_validat ...

  7. MySql创建函数与过程,触发器, shell脚本与sql的相互调用。

    一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...

  8. oracle数据库之存储函数和过程

    一.引言     ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...

  9. JS,Javascript加载与函数执行过程

    Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...

  10. JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程

     壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...

随机推荐

  1. flask+xlswriter+axios导出Excel

    flask后端 starttime = request.json.get('starttime') endtime = request.json.get('endtime') # 根据时间查询数据库数 ...

  2. ORACLE SEQUENCE 详解

    1.    About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用. 序列消除了串行 ...

  3. CSS实现导航栏

    1.知识点 列表 浮动 伪类 背景 文本格式化 盒子模型 2.效果 3.代码 <!DOCTYPE html> <html lang="en"> <he ...

  4. 【Android逆向】脱壳项目 frida-dexdump 原理分析

    1. 项目代码地址 https://github.com/hluwa/frida-dexdump 2. 核心逻辑为 def dump(self): logger.info("[+] Sear ...

  5. 【LeetCode二叉树#14】验证二叉搜索树(巩固迭代中序遍历#1)

    验证二叉搜索树 力扣题目链接(opens new window) 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子 ...

  6. 【Azure API 管理】Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错

    问题描述 Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错,是否有其他可以对URL解码的方法呢? 使用H ...

  7. nmcli命令详解(创建热点,连接wifi,管理连接等)

    目录 简述 语法 比较有用的选项(OPTION) 对象 general对象(常规信息) 用途 语法 networking对象(整个网络) 用途 语法 命令示例 radio对象(无线开关) 用途 语法 ...

  8. 图查询语言 nGQL 简明教程 vol.01 快速入门

    本文旨在让新手快速了解 nGQL,掌握方向,之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询. 视频 本教程的视频版在B站这里. 准备工作 在正式开始 nGQL 实操之前,记得 ...

  9. shell脚本的基本使用

    本文是对菜鸟教程 shell编程原文 的总结并记录 如有侵权 联系删除 简介 说明: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.这个应用程序提供了一个界面,用户通过这 ...

  10. Java与sql中的字符串表示

    在 Java 中,双引号 "" 用于表示字符串字面量,而单引号 '' 用于表示字符字面量.这意味着在 Java 中,您可以使用双引号来包围包含任意数量字符的字符串,包括零个字符(空 ...