题:
如何为新用户提供几乎所有权限,但仍保留一个或多个表/数据库以保护它们.
细节:
如果我有一个数据库,
>生活
还有三张桌子
>密码
>朋友们
>爱好
如何为此用户提供以下权限:
>插入
>更新
>删除
>创造
> DROP
>改变
关于前三个,我会从这样的事情开始:
GRANT INSERT, UPDATE, DELETE ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT INSERT, UPDATE, DELETE ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';
但我对如何使用CREATE和DROP感到困惑.如果我在整个数据库上授予drop权限,如下所示:
GRANT DROP ON life TO username@'localhost' IDENTIFIED BY 'password';
然后用户可以删除我不想要的密码表.我可以根据这样的表格授予它:
GRANT DROP ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT DROP ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';
但是如果我像这样授予CREATE权限会发生什么:
GRANT CREATE ON life TO username@'localhost' IDENTIFIED BY 'password';
这是否意味着用户甚至无法删除他/她创建的表格?我的问题还涉及创建/删除数据库.如果我想允许用户创建和删除尽可能多的数据库而不是生命数据库,该怎么办?
我应该通过将密码表移动到另一个数据库来改变我的方法吗?
先谢谢你.
最佳答案 @ TheScrumMeister建议使用单独的数据库的替代方法是定义一个包装CREATE TABLE的过程,但也授予调用用户DROP权限:
DELIMITER ;;
CREATE PROCEDURE create_table(
tbl_name VARCHAR(64) -- maximum length of a table name
) BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
SET @usr = SUBSTRING_INDEX(USER(), '@', 1); -- invoking username
SET @tbl = REPLACE(tbl_name, "`", "``"); -- prevent SQL injection
-- just create some dummy table initially - the user can modify it after
SET @qry = CONCAT("
CREATE TABLE `", @tbl, "` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
");
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- now grant DROP to the invoking user but only from localhost
SET @qry = CONCAT("
GRANT DROP ON life.`", @tbl, "`
TO CONCAT(?, \"@'localhost'\") IDENTIFIED BY 'password';
");
PREPARE stmt FROM @qry;
EXECUTE stmt USING @usr;
DEALLOCATE PREPARE stmt;
-- clean up
SET @qry = NULL;
SET @usr = NULL;
COMMIT;
END;;
DELIMITER ;
要确保用户不以任何其他方式创建表,它们不应具有CREATE TABLE特权.
你也可以为数据库做类似的事情.