1、创建视图
- CREATE
- VIEW `NewView`AS
- SELECT
- `user`.USER_ID,
- `user`.USER_NAME,
- department.DEPT_ID,
- department.DEPT_NAME
- FROM
- `user` ,
- department
- WHERE
- `user`.DEPT_ID = department.DEPT_ID ;
2、修改视图
- ALTER
- ALGORITHM=UNDEFINED
- DEFINER=`root`@`127.0.0.1`
- SQL SECURITY DEFINER
- VIEW `dept_user` AS
- select `user`.`USER_ID` AS `USER_ID`,`user`.`USER_NAME` AS `USER_NAME`,`department`.`DEPT_ID` AS `DEPT_ID`,`department`.`DEPT_NAME` AS `DEPT_NAME`
- from (`user` join `department`)
- where (`user`.`DEPT_ID` = `department`.`DEPT_ID`)
- ORDER BY
- department.DEPT_NO ASC ;
3、 给视图赋权
- GRANT SELECT, SHOW VIEW ON `NewView`.* TO 'View'@'192.168.%' ;
- flush privileges;
修改后用户还是不能查看,登陆root 也不能查看。
百度得了下面解决办法:
登陆工具-视图-设计视图-高级选项, 修改定义者为需要权限用户 或 修改安全性Definer 为invoker
原理:
definer和invoker的区别
在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。
definer:由definer(定义者)指定的用户的权限来执行
invoker:由调用这个视图(存储过程)的用户的权限来执行
4、修复视图
在MySQL中当一个视图所依赖的的表有变化时,打开或修改视图会出现如下面的错误信息:
1356 - View 'database.view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them.
解决:
从MySQL的information_schema中的视图表View中,用下面的语句修复视图,如:
select VIEW_DEFINITION from information_schema.views where TABLE_SCHEMA='database' and TABLE_NAME='view'