2017-08-31 55 views
3

我有一箇舊的應用程序(無源代碼可用),它連接到一個高效的MySQL數據庫。由於商業原因,我們必須限制對數據庫的訪問。由於這個原因,我寫了一個MySQL觸發器,它會根據ID限制有權訪問數據庫的用戶。在MySQL中獲取CURRENT_USER觸發返回不正確的值

用戶通過應用程序使用自己的ID和他們的私人密碼對數據庫進行身份驗證。

這個問題似乎觸發內部被我有一個SELECT...WHERE子句和WHERE條款等於:一擊是在某個數據庫/表用戶在我想申請做SUBSTRING_INDEX(CURRENT_USER(), @, 1)

基本上每次捕獲該用戶(也顯示在MySQL服務器的進程中),並基於捕獲執行一個SELECT語句,該語句將返回該給定用戶的唯一標識。根據該ID a IF檢查將被執行,保存數據的訪問權將被授予或撤銷。

問題是,即使我使用用戶X登錄應用程序,MySQL的CURRENT_USER()函數以某種方式捕獲我的域用戶,不管我做什麼。它應該捕獲執行該觸發器的域用戶。

全部觸發:

DROP TRIGGER dbname.disable_order_insert_trigger; 

DELIMITER $ 
use dbname$ 

CREATE TRIGGER disable_order_insert_trigger BEFORE INSERT ON 
dbname.dbtable 

FOR EACH ROW 
BEGIN 
    DECLARE compCode INT unsigned DEFAULT 0;   
    SET @compCode = 1; 

    SELECT COMPCODE 
    INTO @compCode 
    FROM dbname.user_info_table 
    WHERE dbname.user_info_table.USERID = SUBSTRING_INDEX(CURRENT_USER(), "@", 1) 
    AND dbname.user_info_table.COMPCODE = 1172 LIMIT 1; 
    SELECT CURRENT_USER() INTO OUTFILE 'C:\\temp\\compCode.txt'; 

IF @compCode = 1172 THEN 
    CALL something; 
END IF; 

END; 
$ 
DELIMITER ; 

SHOW TRIGGERS; 

我的同事登錄到MySQL數據庫通過應用程序中使用他在OUTFILE我的用戶名被寫入PC /用戶名和仍在。 CURRENT_USER()不應該捕獲他的用戶名?

MySQL數據庫的版本是:5.1.19-beta-community-nt-debug。 我也嘗試將Definer觸發器屬性留空,仍然只有我的用戶名被捕獲並寫入文件。

+0

你使用什麼樣的應用程序編程語言和DBMS訪問包? (例如,php/mysqli,java/connector.j,c#/ connector.net)。什麼是您的*應用程序*所使用的連接字符串或證書,而不是您的*應用程序的用戶*來訪問您的數據庫? –

+0

@ O.Jones,它可能是一個帶有一些非常老的本地連接器的VB6傳統應用程序。我們沒有可用的源代碼。 – darksleep

+2

請嘗試:[USER()](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_user)功能。 – wchiquito

回答

1

和wchiquto建議一樣,使用USER()而不是CURRENT_USER()

在sp中,CURRENT_USER()顯示sp的定義者的名字。

+0

,同樣的問題。 @Balazs Vago,作爲文檔指出那些特定的上下文(觸發器,存儲例程,事件等)正在返回'DEFINER'而不是Trigger,Routine,Events等的實際調用者。 – darksleep

+0

謝謝@ O.Jones,@wchiquito和Balazs Vago的文檔。調整觸發器後,它似乎可以工作。 'USER()'函數返回觸發器的調用者而不是定義者。 – darksleep