MySQL中有一种方法可以保护字段不受变化影响吗?

问题描述:

我们得到这个每日数据源。 (我们无法控制原始数据,所以要求他们更正数据库不是一种选择。)MySQL中有一种方法可以保护字段不受变化影响吗?

客户记录包含美国的地址。街道地址,城市,州和邮编。

就我们而言,我们使用市场部门的数据库中的数据。他们有时会发现地址不正确或不完整,并且想对其进行更改。但是,当然,下一个数据馈送将进入并消除其更正。

有没有一种方法可以保护某些字段不受变化的影响,比如电子表格中受保护的单元格。这是一些MySQL的记录布局的字段名称:

地址1
地址2
地址3
城市
状态
邮编

如果我沿着这一侧创建,附加字段是被标记为“Y”或“N”作为受保护字段:

address1
address1_flag
地址2
address2_flag
地址3
address3_flag
城市
city_flag
状态
state_flag
邮编
zipcode_flag

所以当营销部门纠正,例如,邮编,它会设置zipcode_flag为“Y “的意思,是保护现场邮政编码免受进一步的变化。如果原始数据Feed在稍后得到纠正,则如果市场部门的数据库中的邮政编码与原始字段匹配,则zipcode_flag保护将更改为“N”。

这听起来像是从日常饲料管理市场部门数据库的正确方法吗?或者在MySQL中有另一种方法或功能可以做到这一点?谢谢!

+0

希望[this](http://dev.mysql.com/ doc/refman/4.1/en/innodb-lock-modes.html)将帮助你 –

我不认为有一个“受保护”的标志或功能,但有几条道路可以完成您的目标。

第一个也是最具体的是在MySQL中创建一个“受限用户”。要限制用户,您可以/只会授予您不想修改的列的SELECT权限。要做到这一点,你可以使用:

GRANT SELECT(zipcode) ON addresses TO restrictedUser; 

你可以看到这个here的一个很好的例子,或到manual的详细信息。

第二种方法是创建一个选择/插入/更新的过程。这可能是矫枉过正,但可以完成,以满足您的需求,并不需要修改用户权限。

一个选择和更新过程的一个简单的例子是(未测试):

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

+0

因此,当限制用户完成更新时,他们只能被允许更新其他字段,而不是邮政编码字段?当restrictedUser用户尝试更新zipcode字段时,这是否会在MySQL中产生错误条件?如果这很重要,我会用PHP编程。 – Edward

+0

@爱德华正确,它会失败并出现错误。该错误可能是“访问被拒绝”错误。 – newfurniturey

+0

好吧,所以在PHP中会有一个检查,看看权限是否被拒绝,所以它不会产生错误?我希望每日Feed能够添加新的客户记录,但不能更改邮政编码字段(在本例中)。谢谢! – Edward

您可以在列级别管理权限:http://dev.mysql.com/doc/refman/5.1/en/grant.html