2015-11-10 1 views
1

Я работаю с ролями пользователей в своих db - роли имеют разрешения. Другими словами, у меня есть роли - разрешение подключений. Если я удалю что-то другое, это будет бесполезно. Как написать DELETE-запрос в MySQL, который также проверяет значение из другой таблицы. Если это значение существует, повышайте ошибку, если не удаляете его.Как проверить соединение данных (перед удалением) с другими таблицами

Here is my schema: 

    TABLE role ( 
     id , 
     name varchar(255) , 
     UNIQUE (name), 
     # name of role PRIMARY KEY(id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

    TABLE role_permission ( 
     id, 
     role_id, 
     permission_id, 
     PRIMARY KEY(id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

    TABLE permission ( 
     id int(10) , 
     action enum('GET', 'PUT', 'POST', 'DELETE') NOT NULL, 
     modifier enum('Any', 'Own', 'None') NOT NULL DEFAULT 'None', 
     resource_id int(10) unsigned NOT NULL, 
     PRIMARY KEY(id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
CREATE TABLE IF NOT EXISTS `resource` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `resource_name` varchar(100) NOT NULL, # name of resource 
    UNIQUE (`resource_name`), 
    PRIMARY KEY(`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

Вы можете использовать ограничения InnoDB для внешних ключей. –

+0

Мне очень жаль, но я нооби в SQL. У меня есть много-много отношений. Я должен принимать значения из таблицы role_permission? – Sabutobi

+0

Обувь для ваших структур стола. –

ответ

2

Проверьте мою скрипку:

http://sqlfiddle.com/#!9/b9686e/1

Как вы можете видеть на скрипке для user_id=1 нет разрешения назначается так DELETE оператор не удалять ничего. Но для user_id=2 есть разрешение и DELETE успешно.

DELETE my_table 
FROM my_table 
INNER JOIN user_permission up 
ON up.user_id = ? <--- your user_id 
    AND up.permission_id = ? <--- your permission id 
    AND up.access = 1 <--- your value which give permission to delete 
WHERE my_table.id=2 
; 

Добро пожаловать, если возникнут вопросы. Если вы хотите продолжить обсуждение, вы должны предоставить свой sqlfiddle свою реальную структуру таблиц и некоторые данные.

+0

Можем ли мы это сделать без участия? – Sabutobi

+0

Я бы сказал, нет. Или решение станет намного сложнее. – Alex

Смежные вопросы