2012-11-08 41 views
2

我們得到這個每日數據源。 (我們無法控制原始數據,所以要求他們更正數據庫不是一種選擇。)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)將幫助你 –

回答

2

我不認爲有一個「受保護」的標誌或功能,但有幾條道路可以完成您的目標。

第一個也是最具體的是在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

相關問題