2017-08-31 80 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