您的方法看起来不错且规范化,对此表示赞赏。
我缺少的一件事是无权限表,即不允许操作的表。
Active Directory 具有此功能,这使您可以快速阻止对对象的权限。
这允许您允许访问所有帐户,除了.....
如果您以相反的方式进行操作,则必须允许访问每个对象,同时忽略 HR 数据。
第一种方式设置了 2 个对象的权限(1 个对父对象的权限,1 个对子对象的解雇),第二种方式可以运行几十个权限。
我个人会更新permissions
表格以包括排除项。
这将允许您将排除项附加到组和用户。
使用黑洞表简化添加新权限
为了简化添加新权限,您可以创建一个新的黑洞表。
这不会存储任何内容,但会触发一个触发器,而不是为您执行插入操作,通过这种方式,您可以隐藏您的数据库已从插入代码中标准化的事实。
CREATE TABLE bh_permission (
user_or_group_id unsiged integer not null,
isuser ENUM('user','group') not null default 'user',
permission_description varchar(255) not null,
allow_or_not ENUM('allow','forbid') not null default 'allow'
) ENGINE = BLACKHOLE;
现在您可以插入指定组或 user_id 的表中
INSERT INTO bh_permission VALUES ('123','group','p_HR_files_2011','forbid');
并有一个触发器来处理技术细节:
DELIMITER $$
CREATE TRIGGER ai_bh_permission_each AFTER INSERT ON bh_permission FOR EACH ROW
BEGIN
DECLARE Mypermission_id INTEGER;
//like is always case-insensitive, `=` is not.
SELECT p.id INTO Mypermission_id FROM permissions p
WHERE name LIKE NEW.permission_description LIMIT 1;
IF isuser = 'user' THEN
INSERT IGNORE INTO user_permission (user_id, permission_id, allow_or_not)
VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
ELSE
INSERT IGNORE INTO group_permission (group_id, permission_id, allow_or_not)
VALUES (NEW.user_or_group_id, Mypermission_id, NEW.allow_or_not);
END IF;
END $$
DELIMITER ;