3

我们得到这个每日数据馈送。(我们无法控制原始数据,因此不能要求他们更正数据库。)

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

最后,我们将数据库中的数据用于营销部门。他们有时会发现地址不正确或不完整,并希望对其进行更改。但是,当然,下一个数据馈送会进来并消除他们的更正。

MySQL 中是否有一种方法可以保护某些字段不被更改,有点像电子表格中的受保护单元格。这是 MySQL 记录布局的一些字段名称:

地址1 地址2地址3城市州
邮政编码




如果我在此旁边创建了标记为“Y”或“N”作为受保护字段的附加字段怎么办:

address1
address1_flag
address2
address2_flag
address3
address3_flag
city
city_flag
state
state_flag
zipcode
zipcode_flag

因此,当营销部门更正例如邮政编码时,它会将 zipcode_flag 设置为“Y”,意思是,是的,保护字段邮政编码不被进一步更改。如果原始数据馈送稍后确实得到更正,那么如果营销部门数据库中的邮政编码与原始字段匹配,则 zipcode_flag 保护将更改为“N”。

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

4

2 回答 2

3

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

于 2012-11-08T13:54:03.047 回答
3

我认为没有“受保护”标志或功能,但您可以采取一些途径来实现您的目标。

第一个也是最具体的将是在 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-08T13:54:40.860 回答