0

抱歉标题不好。我有一个查询(如下)可以正确执行并按照我的意愿创建插入。但是,我想通过仅在三列的精确组合时插入来使其更智能。本质上,三列元组是一个主键,但我正在处理 sqlite 的单个主键的限制。

基本上下文 我有 4 个表:权限、角色、用户、操作权限将角色和用户连接到操作。Actions 表包含用户或具有角色的用户可以执行的可用任务列表。例如,如果 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)
);

这是我在使用它时用来将数据存储在表中的临时表:CREATE TABLE tmp_permissions(roles_name VARCHAR(50), action_name VARCHAR(50));

这里有一些数据:

#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 回答