Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1239430
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 15:58:16

一、视图的创建

  数据库中的View在标准的基础之上做了些扩展,这主要体现在几个方式:

      
  • DEFINER:指定视图的创建者(或者说属主,虽然MySQL中的对象其实不注重属主,这点与ORACLE数据库极为不同),默认当然就是执行CREATE VIEW语句的CURRENT_USER,但是创建时也可以指定不同的用户做为创建者(或者叫视图所有人);
  •   
  • SQL SECURITY:视图查询数据时的安全验证方式,有两处选项:     
            
    • DEFINER:这个不是指创建者了,而是说在创建视图时验证是否有权限访问视图所引用的数据;
    •       
    • INVOKER:指查询视图时,验证查询的用户是否拥有权限访问视图及视图所引用的对象;
    •     
      
  •   
  • ALGORITHM:指定视图的处理方式,有三种选项:     
            
    • MERGE:将视图的定义和查询视图的语句合并处理,。
    •       
    • TEMPTABLE:视图查询的结果保存到临时表,而后在该临时表基础上执行查询视图的语句;
    •       
    • UNDEFINED:由MySQL选择使用哪种算法,一般会首选MERGE,因为MERGE更有效率,再说TEMPTABLE也不支持更新操作。
    •     
      

  下面分别通过实例来阐述上面这几个选项。

  先列出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]


1.1 指定视图安全验证的方式

  所谓安全验证的方式,核心还是权限 - 是否有足够的权限去访问希望访问到的数据。视图相对其实更复制一些,这里先介绍最简单的情况:查询视图,对视图所引用的基表的权限验证。

    提示:

    三思个人感觉这个概念与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对象的权限)。

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

      
  • definer是在定义对象是判断是否有权限,只要创建的用户有权限,那么创建就可以成功,而且所有有权限查询该视图的用户也能够成功执行查询语句 - 不管是否拥有该视图所引用对象的权限;
  •   
  • invoker是指在查询时验证用户是否有权限执行操作,当然创建时也会判断,如果创建的用户没有视图所引用表对象的访问权限,那创建都会失败。
阅读(1446) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~