一.视图概述
mysql视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行的数据。但是,视图并不在数据库中以存储的数据集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
使用视图的好处:1,安全原因,可以隐藏一些数据;2,使复杂的查询易于理解和使用
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图有很多优点,主要表现在:
视点集中
简化操作
定制数据
合并并分割数据
安全性
1.使用举例
eg. 本例创建一个产品表(product)和一个购买记录表(purchase),再通过MySQL视图purchase_detail查询出购买的详细信息。
create table product
(
product_id int not null,
name varchar(50) not null,
price double not null
);
insert into product values(1, 'apple ', 5.5);
create table purchase
(
id int not null,
product_id int not null,
qty int not null default 0,
gen_time datetime not null
);
insert into purchase values(1, 1, 10, now());
create view purchase_detail as select product.
name as name, product .price as price, purchase.qty as qty,
product .price * purchase.qty as total_value from product,
purchase where product.product_id = purchase.product_id;
创建成功后,输入:select * from purchase_detail;
运行效果如下:
+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple | 5.5 | 10 | 55 |
+-------+-------+-----+-------------+
1 row in set (0.01 sec)
1.注意事项:
创建视图存在如下注意事项:
(1) 运行创建视图的语句需要用户具有创建视图(crate view)的权限,若加了[or replace]时,还需要用户具有删除视图(drop view)的权限;
(2) select语句不能包含from子句中的子查询;
(3) select语句不能引用系统或用户变量;
(4) select语句不能引用预处理语句参数;
(5) 在存储子程序内,定义不能引用子程序参数或局部变量;
(6)在定义中引用的表或视图必须存在。但是,创建了MySQL视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用check table语句;
(7) 在定义中不能引用temporary表,不能创建temporary视图;
(8) 在视图定义中命名的表必须已存在;
(9) 不能将触发程序与视图关联在一起;
(10) 在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。
2.修改MySql视图
-
语法
alter [algorithm = {undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]该语句用于更改已有视图的定义。其语法与create view类似。
-
使用举例
eg. 将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:
alter view purchase_detail as select product.
name as name, product .price as price, product .
price * purchase.qty as total_value from product,
purchase where product.product_id = purchase.product_id;
二.The user specified as a definer (”@’%') does not exist完美解决方法
在给一个客户做电商项目实施的时候,mysql数据库报错The user specified as a definer (”@’%') does not exist。尝试过两种方式,第一种重启之后好用,但是一会就又不好用了。第二种算是一种完美的解决方法。此种报错主要是针对访问视图文件引起的。
第一种:
给root赋值所有权限:注意在命令符下面操作。
grant all privileges on *.* to root@”%” identified by “.”;
flush privileges;
但是这种重启之后一会就又不行了。
第二种:
复制视图创建语句,直接将create改成alter,definer改成相关的,比如root@localhost 例如:
用alter view 修改definer的值,alter ALGORITHM=UNDEFINED DEFINER=`public`@`192.168.0.%` SQL SECURITY DEFINER VIEW `view_product` AS 视图选择语句。
通过执行use information_schema;和 select TABLE_SCHEMA,TABLE_NAME,DEFINER from views; 两条语句,可以查询到definer是否更改成功了。
原因分析
因为创建视图使用的是xff@%用户(目前已经不存在),然后登录用户使用的是xff@localhost用户,导致mysql认为现在的用户无权限访问该视图,解决方法就是在当前用户下重建该视图。
题外话:还有一种方法是如果你是运维人员,此问题直接交由程序去处理,让其检查创建触发器、视图、存储过程等sql。如果包含root@%,替换之。重新创建。没有尝试过,后面可以试试。
简单的解决方法:把视图SQL语句在本机上再执行一遍即可,删掉原来的视图即可
eg:原来的视图
在本机执行以后: