0

我正在使用Ruby on Rails v3.2.2,並且我想「保護」一個類/實例屬性,以便數據庫表列值只能以一種方式更新。也就是說,例如,給定我有兩個數據庫表:如何確保只能以一種方式更新數據庫表列?

table1 
- full_name_column 

table2 
- name_column 
- surname_column 

和我管理的table1使得full_name_column通過使用在相關table2類/模型說明回調更新,我想,以確保通過該回調可以更新full_name_column只有

換句話說,我應該確保table2.full_name_column值始終

"#{table1.name_column} #{table1.surname_column}" 

,它不能是其他值。因此,例如,如果我嘗試「直接」更新table1.full_name_column,它應該引發一些錯誤。當然,這個價值必須是可讀的。

可能嗎?你對處理這種情況有什麼建議?


原因這種方法...

我想在table1包含相關的「個人資料」的其他值使用這種方法,因爲我打算在table1列執行數據庫搜索/「person」對象...否則,可能我必須進行一些破解(可能是一種複雜的破解),將這些搜索引導至table2以查找"#{table1.name_column} #{table1.surname_column}"字符串。

所以,我認爲簡單方式是非規範化數據如上所述,但它需要實現一個「罕見」的方式來處理這些數據。

BTW:答案應該是打算「解決」相關流程或找到更好的方法來更好地處理搜索功能。

回答

1

通過將table2中的數據複製到table1中,您已經對它進行了非標準化。與任何反規範化一樣,您必須遵守維護同步的規定。這意味着不更新你不應該的東西。

儘管您可以用attr_accessible隔離事情以防止意外分配,但Ruby的工作方式意味着無法保證該值永遠不會被修改。如果有人確定了,他們會找到一個辦法。這是學科進來的地方。

最好的方法是證明不應該直接修改該列,用attr_accessible塊批量分配,並將其留在那裏。就我所知,沒有寫保護屬性的概念。

+0

當你主要是做,另一個你很好的答案。無論如何,我會稍等一會兒,看看是否有其他人有不同的意見。 – Backo 2012-04-27 15:50:41

2

這裏有兩種維護數據庫級別數據的方法......

視圖和物化表。

如果可能,table1可以是VIEW或例如MATERIALIZED QUERY TABLE(MQT)。術語可能略有不同,具體取決於所使用的RDMS,我認爲Oracle具有MATERIALIZED VIEWs,而DB2具有MATERIALIZED QUERY TABLEs。

VIEW只是對物理上位於某個不同表格中的數據的訪問。其中MATERIALIZED VIEW/QUERY TABLE是數據的物理副本,因此例如不與源數據實時同步。

無論如何。這些方法將提供對數據的只讀訪問權限,這些數據屬於table2所有,但可以通過table1訪問。

很簡單視圖示例:

CREATE VIEW table1 AS 
    SELECT surname||', '||name AS full_name 
    FROM table2; 

觸發器

有時觀點並不方便,因爲你可能真的想在table1的一些數據,是不是可以從其他地方。在這些情況下,您可以考慮使用數據庫觸發器。即創建觸發器,當table2更新時,table1在同一個數據庫事務中更新。

觸發器的問題可能是您必須授予客戶端更新table1的權限。某些RDMS可能會提供一些方法來調整觸發器的訪問控制,即TRIGGER執行的操作將使用啓動TRIGGER的操作的不同特權來執行。

在這種情況下,觸發器可以是這個樣子:

CREATE TRIGGER UPDATE_NAME 
    AFTER UPDATE OF NAME, SURNAME ON TABLE2 
    REFERENCING NEW AS NEWNAME 
    FOR EACH ROW 
    BEGIN ATOMIC 
     UPDATE TABLE1 SET FULL_NAME = NEWNAME.SURNAME||', '||NEWNAME.NAME 
     WHERE SOME_KEY = NEWNAME.SOME_KEY 
    END; 
+0

好!但是,我需要做的事情太多了。不管怎麼說,還是要謝謝你。 – Backo 2012-04-29 00:25:26

+0

這就是決定要維護數據的哪個層,並堅持下去。如果您嚴格控制訪問數據的應用程序代碼,那麼在那裏執行限制和數據複製可能會更容易。 OTOH,如果你有多個應用程序,並且你想要抽象它們,你應該考慮維護數據庫層中的數據。 – Toni 2012-04-29 11:05:01

相關問題