2011-06-16 36 views
1

我正在寫一個rails應用程序,它從另一個(遺留的,因爲它沒有任何單元測試...)系統的表中讀取數據。它沒有對這些表的任何權限(最終,它將擁抱和擴展...)如何防止在夾具加載過程中啓用alter table/trigger

我共享相同的數據庫(postgresql),並且這兩個應用程序有單獨的數據庫用戶。當我加載我的初始設備時,我收到投訴,因爲rails試圖更改所有表以啓用觸發器。我可以關閉它嗎?

PGError:錯誤:必須是關係auth_message 的所有者:ALTER TABLE 「auth_message」 ENABLE TRIGGER ALL; ALTER TABLE 「django_session中」 ENABLE TRIGGER ALL; ALTER TABLE 「django_site」 ENABLE TRIGGER ALL; ALTER TABLE 「django_admin_log」 ENABLE TRIGGER ALL; ALTER TABLE「django_content_type」 ......

+0

看來,這發生在fixtures,從./lib/active_record/fixtures.rb它調用connection.disable_referential_integrity,這是: ./lib/active_record/connection_adapters/postgresql_adapter.rb:def disable_referential_integrity ...我無法輕易禁用這個功能,我可能會寫一個猴子修補程序的rake任務。與此同時,我實際上並不需要在生產環境中加載很多東西,所以我會手動完成。 – mcr 2011-06-16 21:23:04

+0

似乎你的方法正確。但是權限錯誤,正如Postgres所建議的。您需要以超級用戶或該表的所有者身份進行連接。 – 2011-06-17 12:06:00

回答

-1

這裏的簡單的解決方案(登錄到pgAdmin的或PSQL:

ALTER TABLE auth_message OWNER TO [your_username]; 

那麼你的命令,將工作你也可以換一個存儲過程中的變化。可以設置SECURITY DEFINER以允許其他用戶進行更改

這可能不是你想聽到的答案,但基本上你只有三個選項,這是迄今爲止最好的。爲了改變一個表,你必須是所有者或者是超級用戶,所以....

  1. 你可以做到以上(推薦)

  2. 您可以確保這兩個應用程序使用相同的用戶名對於模式更改(我認爲有一個很好的理由你沒有這樣做)。

  3. 你可以讓你的數據庫用戶成爲一個超級用戶,但是這會繞過所有其他的權限檢查。

我認爲你真正的解決方案是確保數據庫更改只來自一個應用程序。

編輯:

其實我只是想到了一個更好的辦法來做到這一點。

CREATE ROLE auth_message_owner WITH INHERIT NOLOGIN; 
ALTER TABLE auth_message OWNER TO auth_message_owner; 
GRANT auth_message_owner TO [app_user_1]; 
GRANT auth_message_owner TO [app_user_2]; 

這會讓兩個不同的db用戶共享該表的所有權。

+0

更改所有權只會將問題從新應用程序移至舊(舊版)應用程序。黑客舊的應用程序是我們正在努力避免的。 – mcr 2013-04-17 17:09:09

+0

增加了一點澄清和其他選項。我真的認爲你需要確保模式的改變只來自其中一個應用程序。 – 2013-04-18 01:10:49

+0

嗯,我可能想出了一個更好的答案。看看它。 – 2013-04-18 01:25:06