sql >> データベース >  >> RDS >> Mysql

mysql-列に助成金を適用する方法は?

    質問を正しく理解しているかどうかはわかりませんが、Personsテーブルからデータを選択する人を制限して、Secret列の値が表示されないようにする機能を求めているようですが、許可する必要がありますクエリの内部(WHERE句など)でSecret列を使用します。

    CREATE TABLE Person
    (
        Id      ...,
        Secret  ...,
        ...
    );
    REVOKE ALL ON Person FROM PUBLIC;
    GRANT SELECT(id) ON Person TO SomeOne;
    

    したがって、私の解釈が正しければ、SomeOneがデータを選択したとき:

    SELECT Id     FROM Person;    -- Works (as required)
    SELECT Secret FROM Person;    -- Fails (as required)
    SELECT Id
      FROM Person
     WHERE Secret = 1;            -- Fails (but we want it to work)
    

    SQLはそれを許可していません、そして正当な理由があります。基本的に、シークレットでクエリ結果を条件付けできる場合は、クエリを繰り返すことでシークレットの値を決定できるため、シークレットであると想定されるものがシークレットのままになることはありません。情報漏えいは非常に簡単です。

    失敗したが「すべきではない」クエリを見ると...その結果から、返されるすべてのIdのシークレット値が1であることがわかります。したがって、これらのId値の場合、シークレットはシークレットではなくなります。

    集合体データの検索のみが許可されている統計データベースを調べると、集合体(結果セットのSUM、COUNT、...)値。これはあなたが直面しているよりも複雑なシナリオです(しかし魅力的なシナリオです)。 C J Date's(絶版) "Introduction to Database Systems、Vol II" 統計データベースとユニークトラッカーについての議論があります。 (「統計データベースの一意のトラッカー」でのGoogle検索により、よりアクセスしやすい便利な情報が明らかになります。)

    ですから、私が何を望んでいるのかを理解していれば、その欲求は誤った方向に進んでいると思います—そしてSQL標準はあなたが求めるものを許可していません。

    回避策はありますか?

    クエリをビューに組み込むことができる場合、ビューを作成する人は基になる詳細データにアクセスしてビューへのアクセスを許可できますが、ビューを使用する人は生のクエリを実行できません。これはあなたが求める保護を与えるかもしれません。同様のコメントがストアドプロシージャに適用され、クエリをより適切にパラメータ化できるようになります。



    1. 次の自動増分を取得

    2. 3番目のテーブルのFK制約の違反を防ぐための制約

    3. 外部キーの制約:ONUPDATEおよびONDELETEを使用する場合

    4. ON句のMySQL不明列