Php 选择枚举时,将字符串分配给另一列
我正在为我的web应用程序创建用户权限功能 假设我有一个表,它有两列(例如,不实用):Php 选择枚举时,将字符串分配给另一列,php,mysql,Php,Mysql,我正在为我的web应用程序创建用户权限功能 假设我有一个表,它有两列(例如,不实用): rank属于ENUM类型,值为“来宾”、“用户”、“管理员” 和另一列权限 是否可以使用纯SQL以某种方式创建此表。这样,当我更新rank列时,它将为permissions列分配预定义的值。但是,我还希望能够在不影响排名列的情况下更改权限。我们可以在更新之前执行触发器 当规范说“updatetherank列”时,我们的意思是表中的一行(或多行)受到update语句的影响。我们并不是要改变表来改变秩列的定义 D
rank
属于ENUM
类型,值为“来宾”、“用户”、“管理员”
和另一列权限
是否可以使用纯
SQL
以某种方式创建此表。这样,当我更新rank
列时,它将为permissions
列分配预定义的值。但是,我还希望能够在不影响排名
列的情况下更改权限。我们可以在更新之前执行触发器
当规范说“updatetherank列”时,我们的意思是表中的一行(或多行)受到update语句的影响。我们并不是要改变表来改变秩列的定义
DELIMITER $$
CREATE TRIGGER `trg_mytable_bu`
BEFORE UPDATE ON `mytable`
FOR EACH ROW
BEGIN
IF NEW.rank <=> OLD.rank THEN
-- no change to rank col value
BEGIN END
ELSE
IF NEW.permission IS NULL THEN
-- defaults apply only if permission value is NULL
IF NEW.rank = 'guest' THEN
SET NEW.permissions = 'fee';
ELSEIF NEW.rank = 'user' THEN
SET NEW.permissions = 'fi';
ELSEIF NEW.rank = 'user' THEN
SET NEW.permissions = 'fo';
ELSE
-- unexpected value of rank
SET NEW.permissions = 'fum';
END IF;
END IF;
END IF;
END$$
DELIMITER ;
分隔符$$
创建触发器'trg\u mytable\u bu`
更新“mytable”之前`
每行
开始
如果是NEW.rank OLD.rank那么
--不更改列的列值
开始结束
其他的
如果NEW.permission为NULL,则
--默认值仅在权限值为空时应用
如果NEW.rank='guest',则
SET NEW.permissions='fee';
ELSEIF NEW.rank='user'然后
SET NEW.permissions='fi';
ELSEIF NEW.rank='user'然后
设置新权限='fo';
其他的
--意外的秩值
SET NEW.permissions='fum';
如果结束;
如果结束;
如果结束;
结束$$
定界符;
如果希望INSERT具有类似的“默认”赋值行为,则需要在INSERT
触发器之前定义一个单独的,该触发器可以类似,但不会引用OLD.rank
回答被问到的问题:是的,这是可能的
回答一个不同的问题(没有被问到)。。。“我们的数据库设计是否应该实现这样的触发器?”为了回答这个问题,我认为我们应该重新思考这个问题,并考虑一些替代设计。从长远来看,不使用枚举列的设计,以及不需要根据分配给枚举的值将默认值分配给另一列的设计,可能会更好地为我们服务。您可以在插入后写入表的|更新触发器;但你的设计听起来已经有缺陷了
- 您的权限字段听起来像是您计划让它保存一个列表;行中的字段应仅包含一个值
- 您对ENUM的使用听起来也相当麻烦,它实际上应该只用于从未或几乎从未改变的事物的集合。(如2000年以前的性别问题)。每当出现新列组时,您必须更改/重建表
相反:
- 权限表:保存权限
- 等级表:保持等级
- 等级权限:关联等级和权限
- 用户:容纳用户
- 用户等级:关联等级和用户
通过以下方式获取用户权限:加入用户到用户的等级,将权限排列到权限。是的,您将使用。然而,这听起来似乎是解决问题的错误方法
使用复数“权限”来描述属性意味着它不是原子的,因此不应存储为单个属性。此外,如果可以通过编程方式从rank
派生权限,则应将其表示为数据。考虑:
create table permissions (
Rank enumeration ('guest', 'user', 'admin')
not null default 'guest',
Permission varchar(25)
Primary key (rank, permission)
);
...
Select u.name, u.rank, u.password,
u.email, group_concat(P.permission) AS permissions
FROM user u
JOIN permissions p
ON u.rank=p.rank
WHERE u.username='bob'
GROUP BY u.name, u.rank, u.password,
u.email
您还可以使用此解析对象的权限:
Select u.name, u.rank, u.password,
u.email, group_concat(P.permission) AS permissions
FROM user u
JOIN permissions p
ON u.rank=p.rank
JOIN object_permissions op
ON p.permission=op.permission
JOIN object o
ON op.object_id=o.object_id
WHERE u.username='bob'
AND o.name='user admin'
GROUP BY u.name, u.rank, u.password,
u.email
在读入存储过程后(由于我不熟悉SQL),存储过程是否算作“纯SQL”。我不会说它会算数,更具体地说,我需要一些东西在创建表的阶段执行这个操作。太好了,去写一个好吧,我在问如何做到这一点。。。选择一个rank
枚举数后。我如何让表自动更新/为权限
列分配值?