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

トリガーを介してテーブルに列権限を適用する

    簡単な答え:ユーザーにデータベースへの直接アクセスを許可しないでください。彼らは決して接続できないはずです。本番データベースにアクセスできるのは、保守と運用の責任者だけです。これはセキュリティ上の理由によるものです。情報がデータベースに保存されているほとんどすべての場合、すべてのアクセスを制御し、実際の更新を処理し、選択したビジネスロジックを適用するアプリケーションがあります。

    データとビジネスロジックを混在させないでください。

    Oracleなど、データベース自体の内部にストアを配置してビジネスロジックの多くを適用することに優れているデータベースシステムがいくつかあります。ただし、これは異なるタイプのアプリケーション、およびシステムを構築するための異なるアプローチのためのものです。

    MySQLには、これを簡単に行うためのツールがすべて揃っているわけではありません。アプリケーションロジックをトリガーとストアドプロシージャおよびビューで記述し、ユーザーにデータベースへの直接アクセスを許可しようとすると、メンテナンスの悪夢に直面していると私が言ったとき、私を信じてください。

    何かにサインアップしたときに、最後にデータベースへの直接アクセスが許可されたのはいつですか。 Twitter、Netflix、Groupon、Facebook-ビジネスルールを適用し、ユーザーに代わってデータベースのデータの読み取りと書き込みを行うWebベースのアプリケーションを操作しています。

    アプリケーションソフトウェアの作成を容易にするツールはたくさんあります。デバッグ、プロファイリング、コードと共同開発のソース管理、単体テスト、継続的インテグレーション、およびデプロイメントツールです。すべてをデータベースに書き込もうとすると、すべてが失われます。

    これがどのように機能するかの簡単な例を次に示します。

    アクセス許可システムを、user、group、user_groupの3つのテーブルとして構成します。ユーザーはシステム内のユーザーアカウントを保持し、グループは「admin」、「client」、「anonymous」などのさまざまなレベルのアクセスを保持します。グループは、ユーザーにアクセスレベルを割り当てる方法です。

    `CREATE TABLE `user` (
    `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `email` varchar(64) NOT NULL,
    PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
     CREATE TABLE `group` (
      `group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(32) NOT NULL,
      PRIMARY KEY (`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `user_group` (
      `user_id` int(10) unsigned NOT NULL,
      `group_id` int(10) unsigned NOT NULL,
      PRIMARY KEY (`user_id`,`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`
    

    次に、いくつかのグループを定義します

    `insert into `group` (name) values ('admin'), ('user'), ('anonymous');`
    

    そして、ユーザーを管理者グループに追加します:

    `insert into user (email) values ('[email protected]');`
    `insert into user_group (user_id,group_id) values (1,1);`
    

    現在、この権限モデルは、ユーザーが1つ以上のセキュリティグループに属することができることを示しています。アプリケーションはそれらのグループをチェックし、結果に基づいてさまざまなアクションを実行します。いくつかの疑似コードを見てみましょう:

    ユーザーのグループを読み込む:

    class User {
    
      private $user_id;
      private $groups;
      private $db;
    
      function load_groups() {
        // query the database
        $result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
        // save an array of group names
        while ($row = $result->fetchrow()) {
          $this->groups[] = $row['name'];
        }
      }
    
      function is_member($group) {
        if (in_array($group, $this->groups) {
          return true;  // user group includes this value
        }
        return false;  // user is not in the group
     }
    

    これで、アプリケーションにデータを表示する関数があるかもしれませんが、ユーザーのグループに応じて異なる結果が生成されます。

    function display_data($user_object) {
       display_basic_data();   // everyone sees the basic data
       if ($user_object->is_member('admin')) {  
         // if the user is an admin, then display bank data too
         display_bank_data();
       }
    }
    

    同様に、データを変更する関数は、ユーザーが変更する権限を持っていることを確認する必要があります。




    1. postgresqlエラーPANIC:有効なチェックポイントレコードを見つけることができませんでした

    2. 日時からのトリミング時間–フォローアップ

    3. この操作に対するSUPER特権

    4. PostgreSqlの予約から作業時間のみを返す方法は?