ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 全面学习MySQL中的视图(2) 指定视图创建者

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

原创 Linux操作系统 作者:junsansi 时间:2011-09-07 16:54:12 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    640
  • 访问量
    4175413