MySQL中视图的安全验证方式

本文通过实例对比DEFINER与INVOKER两种视图安全验证方式的区别,详细解析了MySQL中视图创建者的指定方法及其对视图访问权限的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DEFINER:指定视图的创建者(或者说属主,虽然MySQL中的对象其实不注重属主,这点与ORACLE数据库极为不同),默认当然就是执行CREATE VIEW语句的CURRENT_USER,但是创建时也可以指定不同的用户做为创建者(或者叫视图所有人);
 
SQL SECURITY:视图查询数据时的安全验证方式,有两处选项:
DEFINER:这个不是指创建者了,而是说在创建视图时验证是否有权限访问视图所引用的数据;
INVOKER:指查询视图时,验证查询的用户是否拥有权限访问视图及视图所引用的对象;

首先创建两个视图:

mysql> create sql security definer view j1_v_d as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)

mysql> create sql security invoker view j1_v_i as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)

然后我们新建一个用户tmpdb,仅授予增删改查tmpdb库的权限(并没有操作jssdb.j1的权限):
    
mysql> grant select,insert,update,delete on tmpdb.* to tmpdb identified by "tmpdb";
Query OK, 0 rows affected (0.00 sec)

然后,使用新创建的用户登录执行操作:
[root@test ~]# mysql -utmpdb -p'tmpdb' -h 192.168.11.212 -P 3306 -D tmpdb

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 10425056

Server version: 5.0.56-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| test               |

| tmpdb              |

+--------------------+

3 rows in set (0.00 sec)

mysql> show tables;

+-----------------+

| Tables_in_tmpdb |

+-----------------+

| j1_v_d          |

| j1_v_i          |

+-----------------+
2 rows in set (0.00 sec)


先来看看操作definer验证方式下的视图:
mysql> select * from j1_v_d;

+------+------+

| id   | vl   |

+------+------+

|    1 | a0   |

|    2 | bb   |

+------+------+

2 rows in set (0.00 sec)

mysql> insert into j1_v_d values (3,'cc');
Query OK, 1 row affected (0.01 sec)

可以看到,查询和更新都没有问题,接下来再试试invoker权限定义的视图:

mysql> select * from j1_v_i;
ERROR 1356 (HY000): View 'tmpdb.j1_v_i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

查询时就报错了,更新就更不用说了。上面的这种情况,是由于tmpdb用户没有操作jssdb下对象的权限,因此读取j1_v_i对象时就失败了(虽然它有访问j1_v_i对象的权限)。

这个简单的测试足以表明:

definer是在定义对象是判断是否有权限,只要创建的用户有权限,那么创建就可以成功,而且所有有权限查询该视图的用户也能够成功执行查询语句 - 不管是否拥有该视图所引用对象的权限;

invoker是指在查询时验证用户是否有权限执行操作,当然创建时也会判断,如果创建的用户没有视图所引用表对象的访问权限,那创建都会失败。

<think>我们正在讨论如何在MySQL中删除视图。根据用户的问题,他之前询问了如何创建只读视图,现在转向如何删除视图。 在MySQL中,删除视图使用DROP VIEW语句。 语法: DROP VIEW [IF EXISTS] view_name [, view_name] ...; 说明: - IF EXISTS:可选,用于避免当视图不存在时出现错误。 - view_name:要删除的视图名称,可以同时删除多个视图,用逗号分隔。 例如,删除名为safe_data的视图: DROP VIEW IF EXISTS safe_data; 注意:删除视图不会影响基表的数据,因为视图只是一个虚拟表。 根据引用[1]和引用[2],视图是虚拟表,不存储实际数据,因此删除视图仅仅是删除了视图的定义。 另外,用户之前创建视图时可能使用了WITH CHECK OPTION等选项,但删除视图时不需要考虑这些,因为删除操作只针对视图的定义。 因此,我们可以这样回答用户:</think>### MySQL 删除视图的 SQL 语法详解 在 MySQL 中删除视图使用 `DROP VIEW` 语句,这是管理数据库对象的基本操作。视图作为虚拟表,删除时不会影响底层实际数据表的结构和数据[^1][^2]。 #### 📌 核心语法 ```sql DROP VIEW [IF EXISTS] view_name [, view_name2, ...]; ``` #### 🔍 参数说明 1. **`IF EXISTS`**(推荐使用) - 可选参数,避免视图不存在时报错 - 示例:`DROP VIEW IF EXISTS sales_report;` - *未使用时的风险*:若视图不存在,将触发 `ERROR 1051 (42S02)` 错误 2. **`view_name`** - 需删除的视图名称(支持同时删除多个视图,逗号分隔) - 示例:`DROP VIEW v_customer, v_orders;` #### ⚠️ 注意事项 1. **权限要求** - 用户需具备视图的 `DROP` 权限(通常由 DBA 授予)[^2] - 验证权限:`SHOW GRANTS;` 2. **级联影响** - 删除视图后,依赖该视图的存储过程/函数会失效(需重建) - 示例:若存储过程 `sp_report` 引用了视图 `v_sales`,删除视图后调用存储过程将报错 3. **元数据清除** - 视图删除后,其定义从 `information_schema.views` 系统表中移除 - 验证命令: ```sql SELECT * FROM information_schema.views WHERE TABLE_NAME = 'your_view_name'; ``` #### 🛠 操作示例 ```sql -- 安全删除单个视图(推荐) DROP VIEW IF EXISTS employee_readonly; -- 批量删除多个视图 DROP VIEW IF EXISTS sales_2023, inventory_summary; -- 删除后验证 SHOW FULL TABLES WHERE TABLE_TYPE LIKE 'VIEW'; -- 查看剩余视图 ``` #### 💡 应用场景 1. **开发环境迭代**:废弃旧版视图(如 `v_report_legacy`) 2. **权限重构**:移除不再需要的数据访问入口 3. **性能优化**:替换复杂视图为物化视图或新查询结构 > 📌 **重要提示**:生产环境操作前务必备份视图定义 > ```sql > SHOW CREATE VIEW your_view_name; -- 保存输出结果 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值