当前位置:首页 >休闲 >创建视图与函数,你注意过 Definer是啥意思吗 在创建视图及函数的函数时候

创建视图与函数,你注意过 Definer是啥意思吗 在创建视图及函数的函数时候

2024-06-29 05:57:07 [百科] 来源:避面尹邢网

创建视图与函数,创建你注意过 Definer是视图啥意思啥意思吗

作者:MySQL技术 数据库 MySQL 在 MySQL 数据库中,在创建视图及函数的函数时候,你有注意过 definer 选项吗?注意在迁移视图或函数后是否有过报错情况,这些其实都可能和 definer 有关系。创建本篇文章主要介绍下 MySQL 中 definer 的视图啥意思含义及作用。

[[415822]]

本文转载自微信公众号「MySQL技术」,函数作者MySQL技术。注意转载本文请联系MySQL技术公众号。创建

 前言:

在 MySQL 数据库中,视图啥意思在创建视图及函数的函数时候,你有注意过 definer 选项吗?注意在迁移视图或函数后是否有过报错情况,这些其实都可能和 definer 有关系。创建本篇文章主要介绍下 MySQL 中 definer 的视图啥意思含义及作用。

创建视图与函数,你注意过 Definer是啥意思吗 在创建视图及函数的函数时候

1.DEFINER简单介绍

创建视图与函数,你注意过 Definer是啥意思吗 在创建视图及函数的函数时候

以视图为例,函数我们来看下官方给出的视图创建基础语法:

创建视图与函数,你注意过 Definer是啥意思吗 在创建视图及函数的函数时候

  1. CREATE 
  2.     [OR REPLACE] 
  3.     [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE}] 
  4.     [DEFINER = user] 
  5.     [SQL SECURITY {  DEFINER | INVOKER }] 
  6.     VIEW view_name [(column_list)] 
  7.     AS select_statement 
  8.     [WITH [CASCADED | LOCAL] CHECK OPTION] 

仔细看上面语法,发现 definer 出现了两次,一次是 DEFINER = user 一次是 SQL SECURITY 选项可以设置为 DEFINER 或 INVOKER ,看到这里,你有猜到 definer 的作用了吗?

definer 翻译成中文是“定义者”的意思。MySQL中,创建视图(view)、函数(function)、存储过程(procedure)、触发器(trigger)、事件(event)时,都可以指定 DEFINER = user 选项,即指定此对象的定义者是谁,若不显式指定,则创建此对象的用户就是定义者。

对于视图、函数及存储过程,还可以指定 SQL SECURITY 属性,其值可以为 DEFINER(定义者) 或 INVOKER(调用者),表示在执行过程中,使用谁的权限来执行。DEFINER 表示按定义者拥有的权限来执行,INVOKER 表示用调用者的权限来执行。

默认情况下,SQL SECURITY 属性为 DEFINER 。其值为 DEFINER 时,数据库中必须存在 DEFINER 指定的定义者用户,并且该定义者用户拥有对应的操作权限及引用的相关对象的权限,执行者只需拥有调用权限就能成功执行。当 SQL SECURITY 属性为 INVOKER 时,则需要执行者有调用权限并且有引用的相关对象的权限,才能成功执行。

简单来说,假设一个视图查询了 a b c 三张表,若此视图的 SQL SECURITY 属性为 DEFINER ,当使用用户 u 查询此视图时,用户 u 只需此视图的查询权限即可;若此视图的 SQL SECURITY 属性为 INVOKER ,则用户 u 需要有此视图的查询权限且有 a b c 三张表的查询权限。下面通过示例来具体演示下:

  1. # 创建两个视图 定义者都是testuser 查询的是test_tb表 
  2. mysql>  show grants for 'testuser'@'%'; 
  3. +------------------------------------------------------------------------------------------------------+ 
  4. | Grants for testuser@%                                                                                | 
  5. +------------------------------------------------------------------------------------------------------+ 
  6. | GRANT USAGE ON *.* TO 'testuser'@'%'                                                                 | 
  7. | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE VIEW, SHOW VIEW ON `testdb`.* TO 'testuser'@'%' | 
  8. +------------------------------------------------------------------------------------------------------+ 
  9. 2 rows in set (0.00 sec) 
  10.  
  11. mysql>  show create view view_definer\G 
  12. (责任编辑:综合)

    推荐文章
    热点阅读