【问题标题】:Is there a method in MySQL to protect fields from changes?MySQL中是否有一种方法可以保护字段免受更改?
【发布时间】:2012-10-28 17:19:35
【问题描述】:

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

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

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

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

地址1
地址2
地址3
城市

邮政编码

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

address1
address1_flag
address2
address2_flag
address3
address3_flag
city
city_flag
state
state_flag
邮政编码
zipcode_flag

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

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

【问题讨论】:

  • 希望this能帮到你

标签: mysql


【解决方案1】:

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

第一个也是最具体的方法是在 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

【讨论】:

  • 那么当受限制的用户完成更新时,他们将只被允许更新其他字段,而不是邮政编码字段?当受限制的用户用户尝试更新邮政编码字段时,这是否会在 MySQL 中生成错误条件?如果这很重要,我会用 PHP 编程。
  • @Edward 正确,它会因错误而失败。该错误可能是“拒绝访问”错误。
  • 好的,那么在 PHP 中是否会检查权限是否被拒绝,因此不会产生错误?我希望每日提要能够添加新的客户记录,但不更改邮政编码字段(在本例中)。谢谢!
  • @Edward 是的,实际上你可以。当出现错误时,您始终可以检查返回的错误编号以确定它是“什么样的”错误。确切的错误(对于UPDATE)看起来像“ERROR 1143 (42000): UPDATE command denied to user ...”。这意味着,错误号将是1143。如果您使用的是mysqli,您可以通过$mysqli->errno 获取号码(查看here 了解更多信息)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2014-05-23
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2018-12-10
    • 2017-11-27
    • 2012-03-28
    • 2011-07-25
    相关资源
    最近更新 更多