3

我有一个相当简单的数据库,由三个(相关)表组成:用户、权限和用户权限。基本前提很简单:创建用户时,权限表中的所有记录都会自动添加到 user_permissions 表中,并具有默认值。这一切都很好。

但是,由于我目前处于开发阶段,我会继续添加新权限,现有用户当然不会拥有这些权限,因为这些新权限在创建时不存在于权限表中。因此,我有一个绝妙的主意,即创建一个小存储过程来自动更新 user_permissions 表,其中包含 user_permissions 表中当前不存在的所有权限。

所以,简而言之,我想做的是(伪代码)

For each user without x permission in user_permissions, insert into user_permissions user_id and permission_id

我不太确定如何从 SQL POV 执行此操作。我玩了连接并且“不存在”,但还没有真正得到任何地方。

您可以在这里使用我的架构:http ://sqlfiddle.com/#!3/ b0761/3 提前感谢您的帮助!

编辑:架构:

CREATE TABLE users (
  user_id      int IDENTITY(1, 1) NOT NULL,
  user_name    varchar(255),
  PRIMARY KEY (user_id));

CREATE TABLE permissions (
  permission_id          int IDENTITY(1, 1) NOT NULL, 
  permission_name        varchar(255) NOT NULL, 
  PRIMARY KEY (permission_id));

CREATE TABLE user_permissions (
  user_id       int NOT NULL, 
  permission_id int NOT NULL, 
  value         tinyint DEFAULT 0 NOT NULL,  
  PRIMARY KEY (user_id, 
  permission_id));

ALTER TABLE user_permissions ADD CONSTRAINT FK_user_pe338140 
FOREIGN KEY (permission_id)
REFERENCES permissions (permission_id);

ALTER TABLE user_permissions ADD CONSTRAINT FK_user_pe405324 
FOREIGN KEY (user_id) REFERENCES users (user_id);

INSERT INTO users(user_name) values('test_username');
INSERT INTO users(user_name) values('test_username2');

INSERT INTO permissions(permission_name) VALUES('permission_1')
INSERT INTO permissions(permission_name) VALUES('permission_2')

INSERT INTO user_permissions(user_id, permission_id, value)
VALUES(1, 1, 1)

INSERT INTO user_permissions(user_id, permission_id, value)
VALUES(2, 1, 1)

编辑:到目前为止查询

SELECT a.user_id, b.permission_id, 1 as 'value'
FROM USER_PERMISSIONS a right outer join 
PERMISSIONS b on a.permission_id = b.permission_id
4

4 回答 4

2
insert into user_permissions (user_id, permission_id)
select
  u.user_id,
  p.permission_id
from
  users u
  cross join permissions p
where
  not exists (select 0 from user_permissions with (updlock, holdlock)
              where user_id = u.user_id and permission_id = p.permission_id)

参考:只有在行不存在时才插入行

于 2012-07-12T18:25:02.107 回答
1
INSERT dbo.user_permissions([user_id], permission_id, [value])
SELECT u.[user_id], p.permission_id, 1
FROM dbo.user_permissions AS u 
CROSS JOIN dbo.[permissions] AS p
WHERE NOT EXISTS (SELECT 1 FROM dbo.user_permissions 
  WHERE [user_id] = u.[user_id]
  AND permission_id = p.permission_id
)
GROUP BY [user_id], p.permission_id;

顺便说一句,您应该避免使用往往需要分隔符的名称,例如user_id关键字permissions/保留字。

于 2012-07-12T18:25:00.157 回答
1

Mansfield,如果我对您的理解正确,您希望在添加新权限时为 user_permissions 表添加一个值。

我还假设您希望它默认为 0。插入新权限后,运行此代码将为所有用户播种 user_permissions 表,对于当前未使用的任何权限,默认值为 0。

--insert into permissions(permission_name) values('newperm');
--select * from permissions
insert into user_permissions(user_id, permission_id, value)
select
  u.user_id, p.permission_id, 0
from
             users u
  cross join permissions p
where
      p.permission_id not in(select permission_id from user_permissions)
;
--select * from user_permissions;
于 2012-07-12T18:47:40.900 回答
0

以下查询将为您提供要插入的缺少的用户权限行:

select a.USER_ID,b.permission_id from users a,permissions b,user_permissions c
   where c.user_id <>a.user_id and c.permission_id <> b.permission_id
于 2012-07-12T18:20:16.263 回答