2012-01-11 14 views
1

私はこのような何かを実行したい:SELECT権限なしで特定のレコードを更新するにはどうすればよいですか?

UPDATE grades SET status="pass" WHERE recno=123; 

は、しかし、私はそれがSELECTアクセス権を持っていないことを意味し、データベースへの書き込み専用アクセス権を持つようにアップデートを実行するユーザーアカウントをしたいです。これにより、WHERE句が失敗します。

実際にはレコード全体を書き換えることができますが、recnoが主キーであるため書き込みが失敗します。方法はありますか

INSERT INTO grades (recno,name,status,...) VALUES (123, 'chemistry', 'pass',...) 
    ON DUPLICATE KEY UPDATE <everything>; 

これは間違ったアプローチですか?また、「特定のレコードの特定のフィールドを更新する」問題に対する一般的な解決策ではありません。

+0

さらに詳しい情報:ログをリモートサーバーに書き込むアプリケーションがあります。アプリケーションは、プロシージャの開始時に「不完全」のステータスで新しいレコードを書き込みます。このステップは、Mysqlサーバーから自動的に生成されたrecno値を受け取ります。プロセスが完了したら、そのレコードのステータスフィールドを新しい値で変更したいと思います。誰でもアプリケーション上で文字列を実行してログイン資格を取得できるため、そのアカウントにデータベースへの書き込み専用アクセス権を与える必要があります。 –

+0

「誰でもデータベース上で文字列を実行できる」とはどういう意味ですか?あなたは誰でもあなたのデータベースに_write_へのアクセスを許可しますか?それは非常に危険です。 – kba

+0

誰かが*アプリケーション*で文字列を実行できるということを意味しました。例えば。誰でもアプリをリバースエンジニアリングして、ログイン情報が何であるかを知ることができます。ですから、そのログインをその機能に必要な操作だけに制限したいのです。 –

答えて

4

これは、テーブルを保護するための特別な方法です。いくつかのケースでは意味をなさないかもしれませんが、通常はユーザーがデータへの影響を知ることができないように、可視性のウィンドウを提供したいと考えています。

書き込み専用データベースを完全に実装するには、ストアドプロシージャを使用します。プロシージャはデータベースへのフルアクセス権を持ち、ユーザーにはストアドプロシージャへのアクセスのみを許可することができます。

+0

これは最高の答えだと思います。今すぐストアドプロシージャを書く方法を学ぶ。 –

+1

これはかなりうまくいっていますが、攻撃者はrecno値を推測してデータベースを破損する可能性があります。私はそれを防ぐためにセキュリティプロトコルを考え出しました。皆様のおかげです。 –

1

VIEWを作成し、ユーザーにフルアクセス権を付与します。このビューには、ユーザーが編集できるようにする行のみが含まれている必要があります。

異なる可能性があり、おそらくより適切なアプローチは、このメカニズムをDBMSから完全に抽象化し、代わりにユーザーが照会できるようにするAPIを作成することです。

0

これは、簡単にアクセスの正しいレベルを付与することにより達成される:

REVOKE ALL ON TABLE GRADES FROM USER1; -- to clear out all privileges 
GRANT INSERT, UPDATE, DELETE ON TABLE GRADES TO USER1; 

これは、USER1はグレード表から、選択、挿入、更新、削除ではなく、できるようになります。

USER1PUBLICまたは必要なグループを変更してください。
必要に応じてアクセス許可リストを変更します。


あなたの状況は私が教えるために使用されるIBMのデータベースのコースで古典的な例のバージョンです: 財務スタッフは、%賃上げを与えることを許可されていますが、給与レベルがために、何であるかを見ていません従業員なので、それらを実行することにより、15%の賃上げを与えることができます

GRANT UPDATE ON TABLE EMPLOYEE TO ACCT_STAFF; -- an no other privileges 

UPDATE EMPLOYEE SET PAY = PAY * 1.15 WHERE EMPLOYEE_ID = 666; 
+0

これは本質的に私がすでに行ったことですが、 "WHERE recno = 123"節にはSELECT権限が必要です。例えば。 "ERROR 1143(42000):テーブル 'EMPLOYEE'の 'EMPLOYEE_ID'列に対してユーザー 'ACCT_STAFF'に対してSELECTコマンドが拒否されました –

+0

@EdwardFalk SELECTステートメントなしで* WHERE recno = 123を使用できます – Bohemian

+0

あなたが与えた正確なコマンドを使って5.1.41-3ubuntu12.10で試したところ、 "ERROR 1143(42000):SELECTコマンドがユーザーに拒否されました"テーブル「EMPLOYEE」の列「EMPLOYEE_ID」に対してACCT_STAFF'@'foo.com 'を追加することができます。サーバの最新バージョンではこれを許可することができます。 –

0

うーん!私はそれを持っている。私は、recnoカラムだけに対してユーザにSELECT権限を与えます。

質問を開いたままにしておくと、誰かがより良い回答を出してくれます。

関連する問題