2013-02-12 99 views
3

我在GRANT和变量一起在MySql中有一些麻烦。如何在变量中使用GRANT?

SET @username := 'user123', @pass := 'pass123'; 

GRANT USAGE ON *.* TO @[email protected]'%' IDENTIFIED BY @pass; 
GRANT INSERT (header1, header2, headern) ON `data` TO @[email protected]'%'; 
GRANT SELECT (header1, header2) ON `data2` TO @[email protected]'%'; 

我希望把用户名和密码的变量在脚本的开头,再后来在GRANT使用它们

所以不是这样的:

GRANT USAGE ON *.* TO 'user123'@'%' IDENTIFIED BY 'pass123'; 

我会喜欢使用这样的东西:

GRANT USAGE ON *.* TO @[email protected]'%' IDENTIFIED BY pass; 

我真的很感激,如果有人能告诉我适当的声明秒。 谢谢你的声音!

+0

应该不是被'IDENTIFIED BY @ pass',你错过了'@' – asifsid88 2013-02-12 10:37:31

+0

谢谢,我纠正它,但这不是解决的主要问题。 :( – Pho3nixHun 2013-02-12 10:40:10

+0

变量只能用于SQL允许表达式的地方,GRANT语句中没有表达式,你可以用动态SQL做。 – Barmar 2013-02-12 10:53:35

回答

3
SET @object = '*.*'; 
SET @user = '''user1''@''localhost'''; 

SET @query = CONCAT('GRANT UPDATE ON ', @object, ' TO ', @user); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

DROP PROCEDURE IF EXISTS `test`.`spTest`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `spTest`(varLogin char(16), varPassword char(64)) 
BEGIN 
    DECLARE varPasswordHashed CHAR(41); 
    SELECT PASSWORD(varPassword) INTO varPasswordHashed; 

    # Any of the following 3 lines will cause the creation to fail 
    CREATE USER [email protected]'localhost' IDENTIFIED BY varPassword; 
    GRANT USAGE ON test.* TO [email protected]'localhost' IDENTIFIED BY varPassword; 
    GRANT USAGE ON test.* TO [email protected]'localhost' IDENTIFIED BY PASSWORD varPasswordHashed; 

    ## The following 3 lines won't cause any problem at create time 
    CREATE USER [email protected]'localhost' IDENTIFIED BY 'AnyPassordString'; 
    GRANT USAGE ON test.* TO [email protected]'localhost' IDENTIFIED BY 'AnyPassordString'; 
    GRANT USAGE ON test.* TO [email protected]'localhost' IDENTIFIED BY PASSWORD 'AnyPassordString'; 
END$$ 

DELIMITER; 
+0

非常感谢!它就像一个魅力!:) – Pho3nixHun 2013-02-12 12:23:26