最近在写程序,把SQL都丢到数据库后,只给一个账号执行数据库的权限.
1.我们也可以不给与 权限
至于这二项,要给还是不给,暂时还不明白.
2.这个账号目前只能执行存储过程,不能执行SQL语句.
如下以下存储过程
DELIMITER $$
USE `tymes`$$
DROP PROCEDURE IF EXISTS `Prod_UPH_GetMAX`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Prod_UPH_GetMAX`(
IN para0 VARCHAR(2) -- 模式
,IN para1 VARCHAR(30) -- 开始日期
,IN para2 VARCHAR(30) -- 结束日期
)
SQL SECURITY DEFINER COMMENT 'GetMaxUPH' -- SQL SECURITY INVOKER/DEFINER
BEGIN
SELECT * FROM ( SELECT
w.`TypeName` AS 产品
,MAX(u.`UPH`) AS MAXUPH
,u.`ProdQTY` AS 产量
,u.`SpentTime` AS 时间
FROM
`ns_product_uph` u
INNER JOIN `ns_order_work` w
ON (u.`MOKEY` = w.`uuidOrderWork`)
WHERE u.`CREATE_DATE` BETWEEN para1 AND para2
AND u.`IsUPH`='true'
GROUP BY w.`TypeName` ASC) uph LIMIT 0,1000;
END$$
DELIMITER ;
解释一下这一句 SQL SECURITY INVOKER/DEFINER
SQL SECURITY INVOKER 以执行存储过程的实际用户执行存储过程,此时,因为此用户没有Select insert update dalete 所以最终则是失败
SQL SECURITY DEFINER 以创建存储过程的用户执行,一般情况下,此用户权限会开放Select insert update dalete 所以存储过程能成功执行
调用过程中发现一问题
SELECT privilege on mysql.proc to parse column types
意思很明显,就是说,没有查询mysql.proc表权限,奇怪的是我们,其实并不需求执行这个操作.此表是存储整个数据存储过程信息的地方.
查了一些资料显示,说是MYSQL官方JDBC驱动的问题.
所以,只好放弃.把这个表的查询权限也给予到此执行存储过程的用户.(要有相关权限)
GRANT SELECT ON `mysql`.`proc` TO 'webuser'@'192.168.1.%';
此时再执行存储过程,OK,没问题了.数据安全就好一点
1.此时,无法通过phpmyadmin登录
2.可以看到information_schema 表信息mysql.proc 表内容.可以看到项目表的存在过程信息,但看不到表信息.
SQL SECURITY DEFINER 如果此时还出现权限问题,请检查相关权限,首先是创建存储过程的用户是什么,权限是什么,建议(只开执行存储过程权限,创建临时表权限, (不知道是不是创建存储过程的账号开了就不用开?))大家可以试一下,性能.
SQL SECURITY INVOKER 很简单,就检查实际用户权限,不建议,除非.sql与存储过程结合,但权限却还要放开.
之前曾有一个问题就是,连接数据库时,提示无权限,检查后发现,返回的主机名称竟不是我电脑的,检查网络,本机都没找到问题,最后,把服务器重启后就正常了.