2013-02-12 98 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