2017-08-31 8 views
3

生産性の高いMySQLデータベースに接続する古いアプリケーション(ソースコードなし)があります。ビジネス上の理由から、データベースへのアクセスを制限する必要があります。このため、IDに基づいてデータベースにアクセスできるユーザーを制限するMySQL Triggerを作成しました。MySQLのCURRENT_USERを取得するトリガーが間違った値を返します

ユーザは、独自のIDとプライベートパスワードを使用してアプリケーションを介してデータベースに対して認証します。

問題がトリガー内で表示されます私はSELECT...WHERE句を持っているとWHERE句は、に等しいた:基本的にヒットがアプリケーション内のユーザが特定のデータベース/テーブルの上で行われるたびに、私は希望SUBSTRING_INDEX(CURRENT_USER(), @, 1)

(MySQLサーバのプロセスにも表示されます)をキャプチャし、キャプチャに基づいて、与えられたユーザのUNIQUE IDを返すSELECT文を実行します。そのIDに基づいて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; 

私の同僚は、彼が自分のユーザー名が書き込まれますOUTFILEでまだPC /ユーザ名とです使用してアプリケーションを介してMySQLデータベースにログインしています。 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のように、CURRENT_USER()ではなくUSER()を使用してください。

spでは、CURRENT_USER()はspの定義者の名前を表します。

+0

USER()と同じ問題が発生しました。 @Balazs Vagoは、特定のコンテキスト(トリガ、ストアドルーチン、イベントなど)がトリガ、ルーチン、イベントなどの実際の呼び出し元ではなく、「DEFINER」を返していることを示しています。 – darksleep

+0

@ O.Jones、@chchiquito Balazs Vagoのドキュメントを参照してください。引き金を調整した後、それは動作するようです。 'USER()'関数は、トリガーの呼び出し元を返しますが、定義者は返しません。 – darksleep

関連する問題