2009-12-20 42 views
1

我協調一些PHP開發項目。我已經建立了一個工作流程,開發人員可以使用一個Subversion版本庫。當他們準備看看他們的臨時服務器上傳MySQL數據庫轉儲和創建標籤應用。的MySQL DROP DATABASE相當於W/O root訪問權限或DROP權限

我已經配置了一個shell腳本,它會自動部署PHP代碼到的DocumentRoot並配置適當的權限。我現在需要腳本加載數據庫快照。

當我第一次配置新的應用程序創建一個數據庫和用戶帳戶,像這樣:

CREATE DATABASE foodb; 
GRANT ALL ON foodb.* TO [email protected] IDENTIFIED BY 'password'; 

現在,當開發人員檢查了MySQL的新版本轉儲到顛覆我需要刪除舊的數據庫和恢復一個新的快照。我目前正在使用以下工作流程。

1)登錄MySQL作爲根

DROP DATABASE foodb; 
CREATE DATABASE foodb; 
GRANT ALL ON foodb.* TO [email protected] IDENTIFIED BY 'password'; 

2.)登錄到MySQL 「用戶1」

mysql -h localhost -u user1 --password="drumitFed" foodb << new-db-dump-from-subversion.sql 

我想結合上述步驟1和2。我想它會看起來像這樣。該代碼不僅應該刪除表,還包括視圖,索引和存儲過程。

請注意,它必須作爲數據庫用戶而不是超級用戶運行,並且數據庫用戶沒有DROP DATABASE或CREATE DATABASE權限。

mysql -h localhost -u user1 --password="password" foodb << delete-all-tables-and-views.sql 
mysql -h localhost -u user1 --password="password" foodb << new-db-dump-from-subversion.sql 
+0

MySQL的創建和刪除PRIVS上特定的數據庫也賦予該用戶刪除和重新創建數據庫本身的能力。所以你可以放心地給出這個,而不會影響DB之外的任何東西。 – gahooa 2009-12-20 19:57:05

回答

1

我沒有時間來測試這一點,但嘗試授予用戶的CREATE權限MySQL寬,那麼創建每個數據庫的用戶應該有權刪除他們創建的內容,如果不是,您可以授予他們對該數據庫的刪除權限?

+0

好主意。我認爲這會讓我做我想要做的事情。它也允許用戶創建其他數據庫,但這是一個可接受的風險。 – 2009-12-20 19:51:18

1

的選項有:

  1. 運行腳本作爲根
  2. 授予適當的權限的數據庫用戶(S),通過角色如果可能的話。
  3. 暴露爲用戶提供一個轉儲的腳本,它可以獲取root身份運行

數據庫是不會讓你繞過訪問控制的能力。

0

你也許可以在一定程度上作弊。

如果你可以安排它,因此腳本可以作爲root或mysql用戶運行,你可以有腳本安裝數據庫與正確的數據庫權限和「空白」架構設置。

關閉MySQL的

副本-rp ... /清潔/ *的/ var/lib中/ MySQL的/

啓動mysql的

所以,數據庫的乾淨副本具有創建的數據庫和授予陳述,但沒有數據。

-daniel

1

首先,超級用戶或不在這裏沒有直接的關係。 mysql通常有一個「root」用戶,但是這並不一定與root登錄關聯。

你的問題似乎是「我如何做一個mysql用戶,並保持該用戶不必擁有X權限」,這導致了「你不能」的答案。所以看來你的問題一定還有其他的東西。爲什麼你想要使用同一個用戶的一切?

不知何故,您需要擁有更大的權限來設置環境。這可以通過使用單獨的mysql用戶或單獨的mysql服務器,或者通過臨時關閉mysql服務器並在設置期間使用--skip-grant-tables運行它的單獨實例來完成 。

0

您可以授予用戶全局權限。這不是最安全的,但它確實保護了root用戶的密碼,如果這是一個系統,其中刪除數據庫是一種常見操作,那麼數據完整性似乎不太受關注。

可以使用--add降數據庫標誌的mysqldump導入轉儲之前刪除數據庫:

--add-drop-database Add a 'DROP DATABASE' before each create. 
0

爲什麼不這樣做?

mysql -h localhost -u root --password="xxx" foodb << delete-all-tables-and-views.sql 
mysql -h localhost -u user1 --password="yyy" foodb << new-db-dump-from-subversion.sql 

腳本本身不需要以root身份運行。 MySQL的「根」和系統的「根」是分開的東西。

1

您可以使用information_schema來生成執行該作業的SQL查詢。我不知道有足夠的瞭解您所使用的腳本解決方案,所以我不能建議對任何事情,但這裏有一個樣本SQL腳本從MySQL中做的一切:

DELIMITER go 

DROP PROCEDURE IF EXISTS p_drop_all_tables; 
go 

CREATE PROCEDURE p_drop_all_tables() 
BEGIN 
    DECLARE v_table_type VARCHAR(64); 
    DECLARE v_table_name VARCHAR(64); 
    DECLARE v_not_found TINYINT(1) DEFAULT FALSE; 
    DECLARE csr_tables CURSOR FOR 
     SELECT CASE table_type 
        WHEN 'BASE TABLE' THEN 'TABLE' 
        ELSE table_type 
       END table_type 
     ,  table_name 
     FROM information_schema.TABLES 
     WHERE table_schema = SCHEMA() 
     AND  table_type IN ('BASE TABLE', 'VIEW') 
     ; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET v_not_found := TRUE; 

    SET @@foreign_key_checks := OFF; 
    OPEN csr_tables; 
    table_loop: LOOP 

     FETCH csr_tables 
     INTO v_table_type 
     ,  v_table_name 
     ; 
     IF v_not_found THEN 
      CLOSE csr_tables; 
      LEAVE table_loop; 
     END IF; 

     SET @stmt := CONCAT(
      'DROP ' 
     , v_table_type 
     , ' `', v_table_name, '`' 
     ); 
     PREPARE stmt FROM @stmt; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

    END LOOP; 
    SET @@foreign_key_checks := ON; 
END; 
go 

CALL p_drop_all_tables(); 
go 

DROP PROCEDURE p_drop_all_tables; 
go 

DELIMITER;