生産性の高い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
トリガプロパティを空のままにしようとしましたが、私のユーザ名だけがキャプチャされ、ファイルに書き込まれます。
どのような種類のアプリケーションプログラミング言語とDBMSアクセスパッケージを使用していますか? (例えば、php/mysqli、java/connector.j、c#/ connector.netなど)。 *あなたの*アプリケーションのユーザーではなく*あなたのデータベースにアクセスする*アプリケーション*によって使用される接続文字列は何ですか? –
@ O.Jones、それはおそらく非常に古いネイティブコネクタを持つVB6レガシーアプリケーションです。ソースコードはありません。 – darksleep
試してください:[USER()](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_user)機能 – wchiquito