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

指定子程序的权利属性。权利属性影响单元在运行时,执行的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. eclipse安装UML插件

    安装AmaterasUML AmaterasUML 是一个用于 Eclipse 的轻量级 UML 和 ER 图编辑器. 将AmaterasUML的3个jar包拷到Eclpise的plugins文件下: ...

  2. c++STL用法总结

    一.vector的用法 vector<int> vet; 1.排序:sort(vet.begin(), vet.end()), 时间复杂度O(nlogn) 2.查找:if(find(vet ...

  3. C++ 多线程的错误和如何避免(4)

    对共享的资源或者数据做加锁处理 在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为. 比如: #include <iostream> #in ...

  4. win32-CreateDIBSection的使用

    使用CreateDIBSection 可以创建一个设备无关位图 #include <windows.h> using namespace std; int main() { HDC hdc ...

  5. Vulnhub靶机网卡启动失败(Raise network interfaces)

    问题 使用一些Linux靶机进行搭建后可能会出现无法搜索到IP的情况,并且会在系统启动时报错,类似下图所示 这个主要是因为vulnhub上的镜像由于搭建环境.版本等问题不适配,网卡没有正确识别导致的, ...

  6. jdk17新特性梳理

    jdk17新特性梳理 目录 jdk17新特性梳理 jdk8升级至jdk17新特性梳理 升级jdk17的理由 新特性梳理 可以在接口中定义私有方法,主要为了jdk8的default方法 局部变量可以使用 ...

  7. 如何提取html中的token?

    通过正则表达式提取(适用于提取文本结果): Re.seach()提取一个值,通过下标取值 Re.findall()提取多个值,通过下标取值 Resp= reques.get(url);print(re ...

  8. Codeforces Round 638 (Div. 2)B. Phoenix and Beauty

    B. Phoenix and Beauty 这道题目学到的东西: 从给出的数据范围观察,得到一些有用信息(峰哥教的) 考虑无解的情况' 其实这题考虑怎么操作是比较难的,如果能想出来满足条件的结果就比较 ...

  9. Vue前端项目架构梳理

    撰写日期:2020-07-23 撰稿人:彭成刚 转载需经本人同意. Vue前端项目架构梳理 后期可以将TypeScript加入到项目来,对参数的数据类型进行更严格的校验. 现在主流就 Vue 和 Re ...

  10. vscode 提取扩展时出错 XHR failed

    vscode 提取扩展时出错 XHR failed 起因 vscode 安装 Bracket Pair Color DLW 插件,商店打不开了 解决方案 打开 hosts 添加 13.107.42.1 ...