精华内容
下载资源
问答
  • 储存的是视图的定义
    2022-06-02 20:34:45

    视图

            用途非常广泛:可以用在超市年汇总,年报,月报,季报汇总等,都需要用到视图

            视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表,即数据库中只存放视图的定义,即对应的SELECT语句。当用户引用视图时,才根据定义形成虚拟表。

    视图一经定义,就可以和基本表一样进行一些操作:查询:删除;在视图之上再定义视图;受限更新。

    定义视图        

            1、建立视图

            SQL语言使用CREATE VIEW(关键词)命令建立视图,一般格式:

    CREATE VIEW<视图名>[(<列名>[,<列名>].…)]
    AS select statement
    [WITH CHECK OPTION];

            说明:

            select statement  可以是任意复杂的SELECT语句,但不允许含有ORDERBY子句和DISTINCT短语。
            WITH CHECK OPTION 视图上执行的所有数据修改操作(insert、update、delete)的
    行都必须满足视图定义中的谓词条件。 

            组成视图的属性列要么全部省略要么全部指定。如果全部省略视图的属性列由查询中的SELECT子句中的属性列组成

            下面三种情况必须明确指定组成视图的所有列名

            (1)某个目标列不是单纯的属性名,而是聚集函数或表达式。

            (2)多表连接时选出几个同名列作为视图的字段

            (3)需要在视图中为某个列启用新的名字。 

            例:

            建立信息系学生视图。

    CREATE VIEW IS Student
    AS
    SELECT Sno,Sname,Sage
    FROM Student
    WHERE Sdept='IS';

            如果想使用自己定义视图的列名称(如:学号,姓名,年龄) 

            即:

    create view is_student(学号,姓名,年龄)
    as
    select sno,sname,sage
    from student
    where sdept='IS';
    
    select * from is_student

            行列子集视图:

            若一个视图是单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码。称这类视图为行列子集视图

            例,

            建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生(把谓词加入到更新操作中所以要加上 with check option)

    CREATE VIEWIS Student
    AS
    SELECT Sno,Sname,Sage
    FROM Student WHERE Sdept='IS
    WITH CHECK OPTION

            with check option的作用        

            插入、修改和删除操作:DBMS自动加上Sdept=IS’的条件
            例如:

            插入操作,DBMS自动检查Sdept属性值是否为'IS’,如果不是,则拒绝该插入操作;如果没有提供Sdept属性值,则自动定义Sdept为IS 

            例:

            定义一个反映学生出生年份的视图。

    CREATE VIEW BT_S(Sno,Sname,Sbirth)
    AS SELECT Sno,Sname,2022-Sage
    FROM Student

            例:

            将学生的学号及他的平均成绩定义为一个视图。

    CREATE VIEWS_G(Sno,Gavg) AS
    SELECT Sno,AVG(Grade) FROM SC
    GROUP BY Sno 
    
    因为使用了聚合函数,所以视图的列表不能省略

            例:

            建立名称为v1的视图,查询学生的学号,姓名,课程名,成绩。

    两种方法:
    
    create view v1
    as
    select student.sno,sname,cname,grade
    from student inner join sc on student.sno = sc.sno
    inner join course on sc.cno = course.cno
    或
    create view v1
    as
    select student.sno,sname,cname,grade
    from student,course,sc
    where student.sno = sc.sno and sc.cno = course.cno
    
    select * from v1

            例:

            建立名称为v2的视图,统计备选课程的课程号,选课人数和平均成绩

    create view v2(课程号,选课人数,平均成绩)
    as
    select cno,count(*),avg(grade)
    from sc
    group by cno
    
    select * from v2

            2、删除视图格式

    DROP VIEW<视图名>[CASCADE]

            说明:

            。该语句从数据字典中删除指定的视图定义。使用CASCADE才能级联删除该视图和由它导出的视图
            。删除基表时,由该基表导出的所有视图定义都必须显式删除()

            3、查询视图

            视图定义后,用户就可以像对基本表一样对视图进行查询了。(要求掌握视图消解过程,即对视图的查询转换为对基本表的查询。)

            例:

                    在信息系学生的视图中找出年龄小于20岁的学生。

    SELECT Sno,Sage FROM IS Student WHERE Sage<20;
    转换为:
    SELECT Sno,Sage
    FROM Student
    WHERE Sdept='IS’AND Sage<20

            4、更新视图(不推荐更新视图,可以更新基本表)

            更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。对视图的更新最终要转换为对基本表的更新。

            在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。一般地,行列子集视图是可更新的。不同的DBMS有不同的规定。
    (要求掌握视图消解过程,即把对视图的更新转换为对基本表的更新。) 

            5、视图的作用

            视图是存储在数据字典中的一个查询定义,对视图的一切操作最终也要转换为对基本表的操作。合理使用视图有很多意义:

            1)视图能够简化用户的操作。

            视图机制使用户可以将注意力集中在所关心的数据上。简化用户的查询操作,特别是涉及多表的查询。

            2)视图使用户能以多种角度看待同一数据。

            当不同种类的用户共享同一个数据库时,这种灵活性是非常重要的。也就是说不同种类的用户对应不同的视图来访问数据。

            3)视图对重构数据库提供了一定程度的逻辑独立性。

    数据的逻辑独立性是指当数据库重构时,如增加新的关系或对原有关系的修改等,用户的应用程序不会受影响。当数据库重构时,可以通过定义视图实现原来的关系,使用户的外模式保持不变。

            4)视图能够对机密数据提供安全保护。

    对系统中的不同用户定义不同的视图,使用户只能访问他权限范围内的数据。

            5)适当的利用视图可以更清晰的表达查询。 

    更多相关内容
  • MySQLMySQL视图定义者和安全性definer/invoker【MySQL】MySQL视图定义者和安全性definer/invoker做MySQL数据库用户权限规范的时候,将原来业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,忽然发现业务系统部分...

    MySQLMySQL视图定义者和安全性definer/invoker

    【MySQL】MySQL视图定义者和安全性definer/invoker

    做MySQL数据库用户权限规范的时候,将原来业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,忽然发现业务系统部分业务报404错误,经排查,发现是因为报错的业务在调用数据库时,使用了视图,而视图的定义者是原来的'user'@'%',并且安全性设置的是definer,现在这个用户不存在了,虽然新用户'user'@'192.168.1.%’拥有和原来相同的数据库权限,但是依然不能使用这些视图。

    原因找到了,那么解决办法也就出来了:

    一是将所有视图的定义者修改为'user'@'192.168.1.%';

    二是将安全性定义由definer设置为invoker。

    因为是生产环境,不能随便搞,所以采用的是第一种方法,第二种方法没有再试。

    92b1ea3fcead749443fd049f38fa46e5.png

    在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。

    definer:  由definer(定义者)指定的用户的权限来执行

    invoker: 由调用这个视图(存储过程)的用户的权限来执行

    definer

    当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行,与当前用户是否有权限无关。

    24ba3591103a515d8e4d72f9efd36e26.png

    invoker

    当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

    4279ff8865a6ee7be212466b78d2a62a.png

    我们在MySQL创建view、trigger、function、procedure、event时都会定义一个Definer='XXX'

    6f3f76e91f0afcd80bc9b7c66e5e9ae8.png

    加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER

    SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。

    DEFINER 表示按定义者拥有的权限来执行

    INVOKER 表示用调用者的权限来执行

    默认情况下,系统指定为DEFINER

    以存储过程为例:

    (1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;

    (2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;

    (3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;

    (4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。

    我们来看下面几个小例子。

    6e086c23aad2d6203b26b40a322e4fdf.png

    用root帐号登陆

    398aee68320e726bc9c50b3fe67e2683.png

    你会发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。

    我们把上面的invoker改为definer再来试一下

    80ca15aa1468f9a700d0965a5b8ee524.png

    发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。

    现在在MySQL涉及的definer有view、trigger、function、procedure、event。

    一般前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,安全整改,使用其他普通用户,务必要批量修改相关view、trigger、function、procedure、event的definer,否则到出现服务不可用!

    MySQL视图定义者和安全性definer/invoker

    https://pdf.us/2018/02/24/679.html

    MySQL如何修改所有的definer?

    https://www.cnblogs.com/zejin2008/p/4767531.html

    MySQL error 1449: The user specified as a definer does not exist

    https://www.jianshu.com/p/43153801d2af

    MySQLMySQL视图定义者和安全性definer/invoker相关教程

    展开全文
  • 目录视图1、视图定义1、为什么需要视图3、视图的作用优点作用:优点:4、创建视图5、视图使用规则1)视图的嵌套:2)视图排序的覆盖6、修改视图多表连接视图:复杂视图7、 删除视图8:MySQL数据库中的视图保存: ...

    MySQL数据库之视图

    视图

    1、视图定义

    视图通过以定制的方式显示来自一个或多个表的数据
    视图是一种数据库对象,用户可以像查询普通表一样查询视图
    视图内其实没有存储任何数据,它只是对表的一个查询
    视图的定义保存在数据字典内,创建视图所基于对表称为“基表”

    1、为什么需要视图

    例如经常要对emp和dept表进行连接查询,每次都要做表的连接,写同样的一串语句,同时由于工资列队数据比较敏感,对外要求不可见;使用子查询,每次做表的连接写的语句过长,把查询语句做成视图,下次查询视图就好了;
    对这样的问题就可以通过视图来解决。

    3、视图的作用优点

    作用:

    控制安全
    保存查询数据
    

    优点:

    提供了灵活一致级别安全性。
    隐藏了数据的复杂性
    简化了用户的SQL指令
    通过重命名列,从另一个角度提供数据
    

    4、创建视图

    CREATE [OR REPLACE] VIEW 视图名
    	[(alias[, alias]...)]--为视图字段指定别名
    	AS subquery
    	[WITH READ ONLY];
    

    举例说明:创建视图, emp_V1, 包括10号部门的所有雇员信息.

    mysql> create view emp_v1 as	//创建视图emp_v1
        -> select * from emp
        -> where deptno=10;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from emp_v1;
    +-------+-----------+-----------+------+------------+-------+------+--------+
    | empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    |  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
    |  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
    |  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    3 rows in set (0.00 sec)
    
    

    5、视图使用规则

    1. 视图必须有唯一命名
    2. 在mysql中视图的数量没有限制
    3. 创建视图必须从管理员那里获得必要的权限
    4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
    5. 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
    6. 视图不能索引,也不能关联触发器或默认值。
    7. 视图可以和表同时使用

    1)视图的嵌套:

    4 . 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
    可以在创建视图emp_v2中进行嵌套emp_v1;

    mysql> create view emp_v1 as
        -> select * from emp
        -> where deptno=10;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from emp_v1;
    +-------+-----------+-----------+------+------------+-------+------+--------+
    | empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    |  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
    |  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
    |  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    3 rows in set (0.00 sec)
    
    mysql> create view emp_v2 as	//创建视图emp_v2嵌套emp_v1
        -> select * from emp_v1
        -> where job='文员';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from emp_v2
        -> ;
    +-------+--------+--------+------+------------+-------+------+--------+
    | empno | ename  | job    | mgr  | hiredate   | sai   | comm | deptno |
    +-------+--------+--------+------+------------+-------+------+--------+
    |  1014 | 黄盖   | 文员   | 1007 | 2002-01-23 | 13000 | NULL |     10 |
    +-------+--------+--------+------+------------+-------+------+--------+
    1 row in set (0.00 sec)
    
    

    2)视图排序的覆盖

    5 . 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
    下面举例说明,新的视图排序会覆盖原来的视图排序

    mysql> create view emp_v3 as
        -> select * from emp_v1
        -> order by sai desc;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from emp_v3;	//此处是降序的排序
    +-------+-----------+-----------+------+------------+-------+------+--------+
    | empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    |  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
    |  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
    |  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    3 rows in set (0.00 sec)
    
    mysql> select * from emp_v3
        -> order by sai;			//这里覆盖之前升序排序
    +-------+-----------+-----------+------+------------+-------+------+--------+
    | empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    |  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
    |  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
    |  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
    +-------+-----------+-----------+------+------------+-------+------+--------+
    3 rows in set (0.00 sec)
    
    

    6、修改视图

    修改视图可以有两种方法进行修改

    使用CREATE OR REPLACE VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.
    
    –CREATE OR REPLACE VIEW emp_v_10
    	–(id, name, sal, dept_id)
    	–AS SELECT id,name, 
    	–salary, dept_id
    	–FROM employees
    	–WHERE dept_id = 10;
    
    在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名
    
    使用ALTER VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.
    
    –ALTER VIEW emp_v_10
    	–(id, name, sal, dept_id)
    	–AS SELECT id,name, 
    	–salary, dept_id
    	–FROM employees
    	–WHERE dept_id = 10;
    
    在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名
    
    

    2)创建复杂视图
    创建一个从两个表中查询数据,并进行分组计算的复杂视图.
    在数据库中插入另一个表

    mysql> select * from dept;
    +--------+-----------+--------+
    | deptno | dname     | lo     |
    +--------+-----------+--------+
    |     10 | 教研部    | 北京   |
    |     20 | 学工部    | 上海   |
    |     30 | 销售部    | 广州   |
    |     40 | 财务部    | 武汉   |
    +--------+-----------+--------+
    4 rows in set (0.00 sec)
    

    多表连接视图:复杂视图

    多个表更体现出视图的优势
    创建复杂视图将两个表连接起来

    mysql> create view emp_v4 as
        -> select e.*,d.dname
        -> from dept d,
        -> (select deptno,count(1) from emp
        -> group by deptno
        -> having count(1)>=1) e
        -> where d.deptno=e.deptno;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from emp_v4;
    +--------+----------+-----------+
    | deptno | count(1) | dname     |
    +--------+----------+-----------+
    |     10 |        3 | 教研部    |
    |     20 |        4 | 学工部    |
    |     30 |        6 | 销售部    |
    +--------+----------+-----------+
    3 rows in set (0.00 sec)
    
    

    7、 删除视图

       删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.  
       DROP VIEW view_name;
    
    mysql> drop view emp_v1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> drop view emp_v2;
    Query OK, 0 rows affected (0.00 sec)
    

    8:MySQL数据库中的视图保存:

    MySQL视图保存在information_schema表里面

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db                 |
    | db1                |
    | gtid               |
    | it                 |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    | test2              |
    +--------------------+
    10 rows in set (0.00 sec)
    
    mysql> use information_schema 
    

    需要进入information_schema数据库进行查看视图

    mysql> select * from VIEWS 
    	->	where TABLE_NAME='emp_v1'\G;
    *************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: db1
              TABLE_NAME: emp_v1
         VIEW_DEFINITION: select `db1`.`emp`.`empno` AS `empno`,`db1`.`emp`.`ename` AS `ename`,`db1`.`emp`.`job` AS `job`,`db1`.`emp`.`mgr` AS `mgr`,`db1`.`emp`.`hiredate` AS `hiredate`,`db1`.`emp`.`sai` AS `sai`,`db1`.`emp`.`comm` AS `comm`,`db1`.`emp`.`deptno` AS `deptno` from `db1`.`emp` where (`db1`.`emp`.`deptno` = 10)
            CHECK_OPTION: NONE
            IS_UPDATABLE: YES
                 DEFINER: root@localhost
           SECURITY_TYPE: DEFINER
    CHARACTER_SET_CLIENT: utf8
    COLLATION_CONNECTION: utf8_general_ci
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    mysql> 
    
    展开全文
  • 将原来业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,忽然发现业务系统部分业务报404错误,经排查,发现是因为报错的业务在调用数据库时,使用了视图,而视图定义者是原来的'user'@'%',并且安全性设置的是...

    一、问题背景

    做MySQL数据库用户权限规范的时候,将原来业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,忽然发现业务系统部分业务报404错误,经排查,发现是因为报错的业务在调用数据库时,使用了视图,而视图的定义者是原来的'user'@'%',并且安全性设置的是definer,现在这个用户不存在了,虽然新用户'user'@'192.168.1.%’拥有和原来相同的数据库权限,但是依然不能使用这些视图。

    原因找到了,那么解决办法也就出来了:

    一是将所有视图的定义者修改为'user'@'192.168.1.%';

    二是将安全性定义由definer设置为invoker。

    因为是生产环境,不能随便搞,所以采用的是第一种方法,第二种方法没有再试。

    09a0fb0aca5f?utm_campaign=hugo

    二、definer和invoker的区别

    在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。

    definer:  由definer(定义者)指定的用户的权限来执行

    invoker: 由调用这个视图(存储过程)的用户的权限来执行

    definer

    当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行,与当前用户是否有权限无关。

    09a0fb0aca5f?utm_campaign=hugo

    invoker

    当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

    09a0fb0aca5f?utm_campaign=hugo

    创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来指定MySQL在执行存储过程的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。

    默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。

    DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,MySQL会检查DEFINER定义的用户'user_name'@'host_name'的权限;

    INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。

    三、MySQL中的definer是什么,有什么作用?

    我们在MySQL创建view、trigger、function、procedure、event时都会定义一个Definer='XXX'

    09a0fb0aca5f?utm_campaign=hugo

    加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER

    SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。

    DEFINER 表示按定义者拥有的权限来执行

    INVOKER 表示用调用者的权限来执行

    默认情况下,系统指定为DEFINER

    以存储过程为例:

    (1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;

    (2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;

    (3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;

    (4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。

    我们来看下面几个小例子。

    09a0fb0aca5f?utm_campaign=hugo

    用root帐号登陆

    09a0fb0aca5f?utm_campaign=hugo

    你会发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。

    我们把上面的invoker改为definer再来试一下

    09a0fb0aca5f?utm_campaign=hugo

    发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。

    现在在MySQL涉及的definer有view、trigger、function、procedure、event。

    一般前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,安全整改,使用其他普通用户,务必要批量修改相关view、trigger、function、procedure、event的definer,否则会出现服务不可用!

    四、参考

    MySQL视图定义者和安全性definer/invoker

    https://pdf.us/2018/02/24/679.html

    MySQL如何修改所有的definer?

    https://www.cnblogs.com/zejin2008/p/4767531.html

    MySQL error 1449: The user specified as a definer does not exist

    https://www.jianshu.com/p/43153801d2af

    MySQL视图 definer & invoker 权限

    https://www.cnblogs.com/jpfss/p/11004692.html

    展开全文
  • 视图存储过程的定义及使用 二、实验目的 掌握创建与查看视图的两种方法,加深对视图和 SQL Server 图表作用的理解。 熟练利用代码的创建视图,并进行查看视图结果,通过实验考察 with check option 这一语句...
  • 视图定义3. 视图更新 查询使用的数据库文件下载 1. 视图介绍 虚关系 并不预先计算并存储关系,而是在使用虚关系时才通过执行查询被计算出来 (概念上包含查询的结果) 任何不是逻辑模型的一部分,但作为虚关系对...
  • 也可以在视图之上再定义新的视图,但对视图的更新(增,删,改)操作则有一定的限制。 1.1.1 定义视图 1,建立视图 sql语言用create view 命令建立视图,其一般格式为 create view <视图名> [(<列名>[,<...
  • 视图定义及其优点

    千次阅读 2018-06-21 22:48:44
    它本身不独立存储在数据库中,也就是说数据库中只存放视图定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个续表。优点: 1.视图能够简化用户的操作; 2.视图使用户能以多种角度...
  • 数据库的实验六 SQL的数据定义视图),全部上机操作实践过
  • oracle视图详解

    千次阅读 2021-01-28 10:46:15
    视图定义视图(view),也称虚表,不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。每次使用的时候,只是重新执行SQL。视图是从一个或多个实际表中获得的,...
  • Oracle视图

    2020-12-19 18:16:17
    本节介绍Oracle视图视图是Oracle数据库中的一个重要组件。Oracle视图教程列表按照下面的教程了解更多关于Oracle视图:创建视图 - 使用CREATE VIEW语句创建一个新的视图。删除视图 - 使用DROP VIEW语句从数据库中...
  • 视图可以看作是一个临时存储的数据所构成的表(非真实表,虚拟表,其内容由一条查询语句来定义),其实本 质上只是一个select语句。只是将该select语句(通常比较复杂)进行一个“包装”,并设定了一个名字,其后就...
  • 第六章 SQL定义和使用视图

    千次阅读 2021-03-10 06:59:48
    文章目录 第六章 SQL定义和使用视图创建一个视图管理门户创建视图界面视图和相应的类修改视图可更新的视图WITH CHECK选项只读视图查看ID:%VIDList视图属性列出视图依赖 第六章 SQL定义和使用视图 视图是一种虚拟...
  • 但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。——百度百科 关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询...
  • 定义视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并在引用视图时...
  • Oracle-视图

    千次阅读 2020-12-29 23:15:24
    Oracle-视图在项目开发中,有时候会用到多表查询,有很多种方法,比如关联,比如视图,但对于查询来说,视图查询是最快的,如果你的数据库的字段信息很多,那查询就得整表查,比如两表查询,我们就可以把要的字段...
  • 该死的报表这几天每天被该死的报表折腾死了,简直就是折磨。自己刚接手这块业务时间不长,发现以前的人挖的坑,在报表这里就各种...从不同的关联表中取得的数据可以插入一个新的表中,也可以组成一个视图;最后报...
  • 如何在ASP.NET Boilerplate中创建自定义目录并在存储库中使用存储过程,视图和用户定义的函数
  • 在线QQ客服:1922638专业...视图定义视图②查询视图③更新视图视图的作用(与以前相比,我做了一些修改,以扩展以下做法)?1.视图是从一个或几个基本表(或视图)派生的表。2.视图是一个虚拟表:即,仅视图定义存...
  • 内嵌用户定义函数 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------...
  • 前言 视图是数据库系统中一种非常有用的数据库对象。MySQL 5.0 之后的版本添加了对... 存储在数据库中的查询操作 SQL 语句定义视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据
  • 定义视图 ②查询视图 ③更新视图视图的作用 1、学生-课程数据库 (与之前稍微修改了一点,以此展开实践) 2、视图 1、视图是从一个或几个基本表(或视图)导出的表。 2、视图是...
  • 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。——百度百科 关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接...
  • mysql视图存储过程

    千次阅读 2022-05-01 21:00:18
    视图(view)是一种虚拟存在的表,视图中的数据并不在数据表中实际存在,行和列数据来自定义视图的查询中使用的表(基础表),并且在使用视图时动态生成的存储过程是数据库中的一个重要对象,其可以封装sql语句集,...
  • MySQL 的存储过程和视图
  • oracle视图总结

    千次阅读 2021-01-12 05:49:07
    视图存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。视图的优点:1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。2.用户通过简单的查询可以从复杂查询中得到...
  • mysql中的视图、触发器和存储过程 1.视图 1.1 什么是视图 1.2 视图的特点 1.3 视图的使用场景 1.4 语法 1)创建视图 2)查询 3)修改 4)删除 1.5 视图的优点 1.6 视图的缺点 2.触发器 2.1 什么是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 294,883
精华内容 117,953
热门标签
关键字:

储存的是视图的定义