1.2 指定视图创建者
我们知道MySQL数据库其实并不看重对象的属主,起码与ORACLE中schema(user)的定义完全不同,比如说MySQL中的表对象是属于数据库,而不管是谁创建的,这其实就没有了所属用户的概念。不过,视图是一个例外,视图中不仅包含着创建用户的信息,而且这些信息甚至还决定,这些视图是否能够成功的创建。
操作前继续给tmpdb用户授权(以root用户执行下列语句):
mysql> grant create,alter,drop,create view,show view on tmpdb.* to tmpdb;
Query OK, 0 rows affected (0.00 sec)创建视图,指定创建者为 tmpdb:
mysql> create definer=tmpdb view tmpdb.j2_v_t as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)创建另一个视图,指定创建者为当前用户,即root:
mysql> create definer=current_user view tmpdb.j2_v_c as select * from jssdb.j1;
Query OK, 0 rows affected (0.00 sec)
以下操作如非特别说明,均为tmpdb用户身份执行。
创建一个新表:
mysql> create table j2 (id int);
Query OK, 0 rows affected (0.02 sec)
而后,通过tmpdb用户查看上面的几个视图,先看看基础current_user的视图:
mysql> show create view j2_v_c;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| View | Create View |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| j2_v_c | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `tmpdb`.`j2_v_c` AS select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1` |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
再查看基于指定用户的视图:
mysql> show create view j2_v_t;
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| View | Create View |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| j2_v_t | CREATE ALGORITHM=UNDEFINED DEFINER=`tmpdb`@`%` SQL SECURITY DEFINER VIEW `tmpdb`.`j2_v_t` AS select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1` |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1356 | View 'tmpdb.j2_v_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them |
+---------+------+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)虽说拥有show view权限,因此可以直接查看创建的视图,但是在查看指定用户视图时显示,由于权限的原因,tmpdb.j2_v_t实际是不可用的,也就是说,当指定用户时,指定的用户必须要拥有视图所引用的对象的权限,否则即使创建成功,使用时却会出现错误。
要命处恰在于此,创建时没有异常,真正应用时问题才会暴露,这就要求DBA在创建这类视图时必须特别谨慎。
接下来再尝试修改,看看会是什么情况:
首先来看看指定用户是什么情况呢:
mysql> alter view j2_v_t as select * from tmpdb.j2;
Query OK, 0 rows affected (0.00 sec)顺利修改,那么对于root用户创建的视图又会是什么情况呢:
mysql> alter view j2_v_c as select * from tmpdb.j2;
ERROR 1227 (42000): Access denied; you need the SUPER privilege for this operation修改root用户创建的视图时提示权限不足,即使修改的用户已经拥有了tmpdb下的alter/create等权限。从引自看,视图对象又与创建的用户有所关联了。
如果的心探究的话,直接到操作系统中查看视图对象的文件,会生现它只有一个结构文件.frm:
[root@test tmpdb]# more j2_v_c.frm
TYPE=VIEW
query=select `jssdb`.`j1`.`id` AS `id`,`jssdb`.`j1`.`vl` AS `vl` from `jssdb`.`j1`
md5=1e3aea62295d05dfb4f7eb3c98859878
updatable=1
algorithm=0
definer_user=root
definer_host=localhost
suid=2
with_check_option=0
revision=1
timestamp=2011-09-07 16:31:14
create-version=1
source=select * from jssdb.j1这也说明视图虽然只有定义没有实体(也说明视图不允许有索引等关联对象),但仍然与创建用户有一定联系,实际应用时,对于这点也需要注意。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-706845/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7607759/viewspace-706845/