VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DEFINER

功能描述

定义存储过程、函数时支持语法DEFINER = user指定属主。

语法格式

  • 存储过程

    CREATE 
    [OR REPLACE]
    [DEFINER = user]
    PROCEDURE sp_name() 
    plsql_body
    
  • 函数

    CREATE 
    [OR REPLACE]
    [DEFINER = user]
    FUNCTION sp_name()
    RETURNS type
    plsql_body
    

参数说明

  • DEFINER = user:

当创建存储过程、函数时指定SECURITY DEFINER、AUTHID DEFINER、AUTHID DEFINER或者SECURITY DEFINER时声明该函数将以DEFINER指定的用户的权限执行。user后面可以跟@'主机名'或者@'ip',但并不校验主机名或者ip的合法性。

  • sp_name() :

自定义的存储过程或者函数名称。

  • plsql_body:

过程体代码块。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
  • 用户如果是有系统管理员权限的角色,可以定义存储过程、函数的DEFINER 属性为任意用户。
  • 非“系统管理员”创建存储过程、函数的时候,DEFINER属性只能定义为自己。
  • 创建存储过程、函数definer指定的用户不存在时,则会报错。
  • 存储过程的名称sp_name()与过程体的代码之间必须使用“as”或“is”。
  • 存储过程的代码主块中,必须包裹在begin…end;的代码块中。
  • SQL SECURITY 属性为DEFINER时,数据库中必须存在DEFINER指定的定义者用户,并且该定义者用户拥有对应的操作权限及引用的相关对象的权限,执行者以该用户的权限去执行存储过程、函数。
  • 当使用CREATE DEFINER = user FUNCTION/PROCEDURE指定了所属用户时,后来又使用CREATE OR REPLACE进行替换存储过程/函数时,如果DEFINER指定了新的用户,则使用新的用户替换旧的存储过程/函数的用户。

示例

示例1:创建存储过程。

1、创建兼容MySQL的库db_mysql,并进入。

create  database  db_mysql  dbcompatibility  'B';
\c  db_mysql

2、创建普通用户usr1。

CREATE USER usr1 password'12345@abc';

3、创建存储过程指定definer。

CREATE OR REPLACE DEFINER=usr1 PROCEDURE definer1() AS 
BEGIN 
raise info 'create definer procedure'; 
END;
/

返回如下结果表示创建成功:

CREATE PROCEDURE

示例2:创建函数。

1、进入示例1所创建的库db_mysql。

\c  db_mysql

2、创建普通用户usr2。

CREATE USER usr2 password'12345@abc';

3、创建函数指定definer。

CREATE OR REPLACE DEFINER=usr2 FUNCTION definer2() RETURN void
AS
BEGIN
raise info 'create definer fun';
END;
/

返回如下结果表示创建成功:

CREATE FUNCTION