2015-09-03 4 views
0

Я создаю модель для RBAC на сервере sql. У меня есть таблица для разрешений и другая для ролей. Мое сомнение в том, как я могу сделать роль ключом с дублирующимися значениями.sql server, Как создать ключ с дублирующимися значениями

Это фрагмент:

CREATE TABLE permissions (permission int NOT NULL, name varchar(50) NOT NULL, PRIMARY KEY (permission)) 
INSERT INTO permissions (permission, name) VALUES (1, 'createUser') 
INSERT INTO permissions (permission, name) VALUES (2, 'deleteUser') 
INSERT INTO permissions (permission, name) VALUES (4, 'editUserInfo') 
INSERT INTO permissions (permission, name) VALUES (8, 'grantPermissions') 

CREATE TABLE roles (role varchar(50) NOT NULL, permission int NOT NULL, FOREIGN KEY (permission) REFERENCES permissions(permission)) 

INSERT INTO roles (role, permission) VALUES ('admin', 1) 
INSERT INTO roles (role, permission) VALUES ('admin', 2) 
INSERT INTO roles (role, permission) VALUES ('admin', 4) 
INSERT INTO roles (role, permission) VALUES ('admin', 8) 
+2

Вы ищете композитный первичный ключ? 'первичный ключ (роль, разрешение)' –

+0

Я пробовал это. Результат был не тем, что мне нужно. Благодарю. – antonio

+0

@antonio затем объясните, что на самом деле вам нужно. Сделать «разрешение» Ключа кажется ужасной идеей. Ключ должен быть уникальным идентификатором. Однако вы можете создать индекс в поле «разрешение» для производительности. –

ответ

3

Вы не можете и не хотите, чтобы сделать это. Ваша таблица roles должна иметь 1 строку за роль. Но затем вы добавляете третью таблицу, которая служит для сопоставления между вашими таблицами roles и permissions.

Что-то вроде этого:

< роли ----> role_permission_mappings < ----> разрешений

Так ключ вашей roles таблицы будет role.
И ваш role_permission_mappings ключ таблицы будет (role,permission).

EDIT

SQL Fiddle для примера того, что это может выглядеть.

+1

Это позволит вам хранить атрибуты роли в таблице ролей (например, имя, описание, дата создания, дату последнего изменения и т. Д.) И атрибуты разрешений в таблице разрешений (имя, описание и т. Д.). Затем вы также сможете хранить атрибуты RELATIONHIP-разрешения роли в таблице role_permission_mappings (например, дата создания, описание отношения, причины или что-то еще). – JNevill

+0

Я понимаю, что вы оба sstan, JNevil, но делаете у вас есть базовый образец role_permission_mappings. Спасибо – antonio

+0

@antonio: Я отредактировал свой ответ с помощью ссылки SQLFiddle для примера того, как он может быть структурирован. – sstan