1. 程式人生 > >MySQL檢視 definer & invoker 許可權

MySQL檢視 definer & invoker 許可權

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'