wenlien大,
你交代的任務先完成一部分,會再接下去繼續... 
lol
Bunko
Hi Bunko大大:
感謝你的分享,應該請版主大大來把這篇文章至頂才是~
看過你的Stored Procedure之後,突然發現一個小弟之前沒思考周慮到的地方:
1. 權限控管的部份,分成五個在做控管:
user, db, tables_priv, columns_priv, procs_priv.
http://dev.mysql.com/doc/refman/5.1/en/grant-table-structure.html所以,要確定裡面都沒有insert的權限,才可以避免user insert data。
如果可以當然是從程式下手,已達到完美,
再不然,我會建議,從管理的角度下手,儘量使用單一的設定權限方法(資料表)來作。
以你的程式為例,只控管mysql.db這個資料表。
2. 你在procedure中,直接使用update。
...
UPDATE mysql.db SET Insert_Priv='N',Create_priv='N' where db=ctrldb;
...
UPDATE mysql.db SET Insert_Priv='Y',Create_priv='Y' where db=ctrldb;
...
如果考慮到權限控管,不見得一開始每一個user都有insert的權限。
ex.
User 1: select/insert/update table A.
User 2: select table A only.
所以,如果可以有一個資料表將最原始的權限都記錄下來,就更完美了~ (我覺得這個應該可以算是optional)
ex.
[create backup permission table]
-- create permission table:
create table test.db select * from mysql.db where user is NULL;
[setting insert block]
-- backup permission.
insert into test.db select * from mysql.db where db='test';
-- update permission.
update mysql.db set ...;
-- flush privileges.
flush privileges;
[release insert block]
-- stored permission.
delete from mysql.db where db='test';
insert into mysql.db select * from test.db where db='test';
-- delete backup permission.
delete from test.db where db='test';
-- flush privileges.
flush privileges;
此外,小弟發現你有一個計算size的function,是用cursoe來實作。
利用cursor應該會耗用較多的資源,且如果將來有人要接手source code,
其門檻也會變高,所以,我認為用一般的select就可以達到你要的結果:
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`dbsize`$$
CREATE FUNCTION `test`.`dbsize` (in_dbname varchar(64)) RETURNS BIGINT UNSIGNED
BEGIN
DECLARE rtnSize BIGINT UNSIGNED;
select sum(data_length)+sum(index_length) into rtnSize
from information_schema.tables
where table_schema = in_dbname
and table_type = 'BASE TABLE'
and engine = 'MyISAM';
RETURN rtnSize;
END$$
DELIMITER ;
最後,再感謝一次Bunko大大,並期待你後續的分享~