下面是模式的一個簡單的例子:PostgreSQL:可以用語言定義一個會話變量並在視圖中使用它嗎?
Table l10n (l10n_id SMALLINT, code VARCHAR(5))
Table product (product_id INT, ..language-neutral columns..)
Table product_l10n (product_id INT, l10n_id SMALLINT, ..language-specific columns..)
查詢產品的本地化數據就像下面這樣:
SELECT *
FROM product a
LEFT JOIN product_l10n b ON b.id = a.id
LEFT JOIN l10n c ON c.id = b.id
WHERE c.code = 'en-US';
爲了避免大胖子查詢,我想用意見。
其基本思路是基於上述查詢創建一個視圖,而不使用where子句。然後
查詢產品將成爲:
SELECT * FROM product_view WHERE c.code = 'en-US';
另一個想法是具有包含的語言標記,對於每個DB連接/會話定義的變量。
該視圖將基於在where子句中使用變量的第一個查詢。
變量在當前DB會話被設置,然後查詢產品會是如此簡單:
SELECT * FROM product_view;
所以我的問題是:一個做到這一點?怎麼樣?
在postgresql.conf中使用自定義變量是可行的。請參閱文檔Customized Options。
postgresql.conf中:
custom_variable_classes = 'myproject'
myproject.l10n_id = 'en-US'
在DB會話開始(帕拉姆設置爲默認會話級):
SET myproject.l10n_id = 'en-US';
在訪問量:
WHERE c.code = current_setting('myproject.l10n_id')
但是...我不喜歡爲整個服務器定義一個變量。有沒有一種方法可以實現相同的目標,但是要基於每個數據庫?
由於提前,
帕斯卡爾
PS:我postes使用l10n_id爲SMALLINT或直接作爲一個VARCHAR(5)的ISO代碼另一個問題有關。請參閱http:// stackoverflow.com/questions/1307087/how-to-store-language-tag-ids-in-databases-as-smallint-or-varchar (對不起,新用戶只有一個URL :-)
其實我覺得一個全局設置的覆蓋是純粹的天才。對於未定義變量引起的異常很好的解決方法。我經常爲這類事情設置會話級變量,然後通過使用自定義函數將它們包裝到異常中。 – whardier 2014-04-10 20:55:27