0

タイトルが悪くてすみません。適切に実行され、希望どおりに挿入を作成するクエリ (以下) があります。ただし、3つの列の正確な組み合わせの場合にのみ挿入することで、よりスマートにしたいと考えています。基本的に、3 列のタプルは主キーですが、sqlite の単一の主キーの制限に取り組んでいます。

基本的なコンテキスト 4 つのテーブルがあります: アクセス許可、ロール、ユーザー、アクション アクセス許可は、ロールとユーザーをアクションに接続します。アクション テーブルには、ユーザーまたは役割を持つユーザーが実行できる利用可能なタスクのリストがあります。たとえば、user_id = 1 が list_folder アクション (action_id = 1) を実行できる場合、権限テーブルには次のエントリがあります: (id=1, action_id=1, user_id=1, role_id=NULL)。同様に、owner_role (role_id=1) が list_folder アクション (action_id=1) を実行する権限を持っている場合、権限エントリは次のようになります: (id=2, action_id=1, user_id=NULL, role_id=1)。

挿入を行うとき、正確な組み合わせ (action_id=1、user_id=NULL、role_id=1 など) をまだ持っていないことを確認したいと考えています。そして、このセットアップを適切に行うためにSQLを記述する方法が完全にはわかりません。

これが私の基本的な挿入ステートメントです。挿入ステートメントと置換ステートメントを考え出す必要があります。

INSERT INTO permissions (
   action_id
   ,role_id
)
SELECT DISTINCT
   a.id as "action_id"
   ,r.id as "role_id"
   FROM tmp_permissions tmp
   LEFT OUTER JOIN actions a
       ON tmp.action_name = a.name
   LEFT OUTER JOIN roles r
       ON tmp.roles_name = r.name
   LEFT OUTER JOIN permissions p
       ON p.role_id

テーブルの作成 SQL ステートメントを次に示します。

CREATE TABLE permissions (
id INTEGER NOT NULL, 
enabled INTEGER, 
action_id INTEGER, 
user_id INTEGER, 
role_id INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(user_id) REFERENCES users (id), 
FOREIGN KEY(action_id) REFERENCES actions (id), 
FOREIGN KEY(role_id) REFERENCES roles (id)
);
CREATE TABLE actions (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);
CREATE TABLE roles (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);
CREATE TABLE users (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);

作業中にテーブルにデータを格納するために使用している一時テーブルを次に示します。

ここにいくつかのデータがあります:

#role|action
admin|setup
admin|debug
admin|login
admin|view_user
manager|view_employee
manager|enroll_employee
manager|login
employee|schedule
employee|login
customer|guest_login
customer|change_credentials
guest|guest_login

前もって感謝します!

4

1 に答える 1

0

UNIQUEテーブルに制約を追加します。

CREATE TABLE permissions(
    ... ,
    UNIQUE (action_id, user_id, role_id)
)

その後、任意の競合解決アルゴリズムを使用して重複を処理できます。

于 2012-12-07T21:12:45.487 に答える