全面学习MySQL中的视图(2) 指定视图创建者

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值