我们每天都会收到数据。(我们无法控制原始数据,因此要求它们更正数据库不是一种选择。)
客户记录中包含美国的地址。街道地址,城市,州和邮编。
在我们的一端,我们使用数据库中的数据为营销部门。他们有时会发现地址不正确或不完整,并希望对其进行更改。但当然,下一次的数据输入将消除他们的修正。
是否有一种方法inf MySQL可以保护某些字段不被更改,就像电子表格中受保护的单元格一样。这是MySQL记录布局的一些字段名:
address1 address2 address3 城市 状态 邮编
如果我沿此创建附加字段,将其标记为"Y“或"N”为受保护的字段,该怎么办:
address1 address1_flag address2 address2_flag address3 address3_flag 城市 city_flag 状态 state_flag 邮编 zipcode_flag
因此,当营销部门纠正,例如,邮政编码,它会将zipcode_flag设置为"Y“,意思是,是的,保护字段邮政编码不受进一步更改。如果原始数据提要在以后的某个点得到纠正,那么如果营销部门数据库中的get代码与原始字段匹配,那么zipcode_flag保护将更改为"N“。
这听起来像正确的方法来管理营销部门的数据库从日常饲料吗?或者,在MySQL中是否有另一种方法或特性可用于此?谢谢!
发布于 2012-11-08 05:54:40
我不认为有“保护”的标志或功能,但有几条路你可以走,以实现你的目标。
第一个也是最具体的方法是在MySQL中创建一个“受限用户”。要限制用户,您可以/只将SELECT
特权授予您不希望修改的列。要做到这一点,您可以使用:
GRANT SELECT(zipcode) ON addresses TO restrictedUser;
您可以看到这个这里的一个很好的例子,或者在手册中获得详细的信息。
第二种方法是创建一个选择/插入/更新的过程。这一项可能有些过分,但可能是为了满足您的需要而完成的,而且不需要修改用户权限。
选择和更新过程的一个简单示例将(未测试):
CREATE PROCEDURE select_addresses ()
BEGIN
SELECT address1, zipcode FROM addresses;
END
CREATE PROCEDURE update_addresses ( IN recordID INT(11), IN newAddress1 VARCHAR(255) )
BEGIN
SET @query := CONCAT("UPDATE addresses SET address1 = '", newAddress1, "' WHERE id = ", recordId);
PREPARE stmt FROM @query;
EXECUTE stmt;
END
这将允许用户选择您指定允许通过调用select_addresses()
读取的任何列,然后通过update_addresses()
对任何允许的列执行更新。您必须添加几个逻辑层,以便只更新已设置的变量,等等--因此,使用过程实际上可能过高=P
发布于 2012-11-08 05:54:03
您可以在列级别:http://dev.mysql.com/doc/refman/5.1/en/grant.html管理特权。
发布于 2022-07-25 08:07:20
另一种方法是设置一个触发器,关闭记录中的标志。例如,如果表中有一个字段
modified TINYINT(1) NOT NULL DEFAULT 0
然后创建一个触发器来保存数据。
CREATE DEFINER = CURRENT_USER TRIGGER `database_name`.`table_name_BEFORE_UPDATE` BEFORE UPDATE ON `table_name` FOR EACH ROW
BEGIN
IF (NEW.modified=1) THEN
/* Then set any fields you want to preserve to their old value */
SET NEW.address1=OLD.address1;
SET NEW.address2=OLD.address2;
SET NEW.city=OLD.city;
SET NEW.stateprov=OLD.stateprov;
SET NEW.postal_code=OLD.postal_code;
SET NEW.country=OLD.country;
END IF;
END
这将允许您限制修改,除非修改设置为1。如果您希望进一步修改它,并且一旦修改防止它被修改,也可以包括修改标志,因此一旦设置,它就不能更改,除非从db中扣动触发器。
CREATE DEFINER = CURRENT_USER TRIGGER `database_name`.`table_name_BEFORE_UPDATE` BEFORE UPDATE ON `table_name` FOR EACH ROW
BEGIN
IF (NEW.modified=1) THEN
/* Then set any fields you want to preserve to their old value */
SET NEW.modified=OLD.modified;
SET NEW.address1=OLD.address1;
SET NEW.address2=OLD.address2;
SET NEW.city=OLD.city;
SET NEW.stateprov=OLD.stateprov;
SET NEW.postal_code=OLD.postal_code;
SET NEW.country=OLD.country;
END IF;
END
https://stackoverflow.com/questions/13290268
复制相似问题