2013年(350)
分类: Mysql/postgreSQL
2013-04-11 15:58:16
数据库中的View在标准的基础之上做了些扩展,这主要体现在几个方式:
下面分别通过实例来阐述上面这几个选项。
先列出MySQL数据库中视图的创建语法:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
所谓安全验证的方式,核心还是权限 - 是否有足够的权限去访问希望访问到的数据。视图相对其实更复制一些,这里先介绍最简单的情况:查询视图,对视图所引用的基表的权限验证。
提示:
三思个人感觉这个概念与ORACLE中的定义者权限和调用者权限过程非常类似。例如,引用同一个对象,按照不同的方式创建两个视图:
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对象的权限)。
这个简单的测试足以表明: