2009-12-19 77 views
3

在使用Oracle DB一段時間後,我習慣於使用Oracle DB應用程序上下文來實現訪問限制。爲了簡單地把它,在登錄過程被稱爲是把用戶的詳細信息到Oracle應用程序上下文,像這樣:PostgreSQL和/或SQL Server替代Oracle的SYS_CONTEXT

DBMS_SESSION.SET_CONTEXT('context_name', 'user_id', user_id); 

然後訪問可以通過創建視圖是會看在上下文來確定強制執行哪些行能用戶可以看到像這樣:

CREATE VIEW users_vw AS 
SELECT * 
    FROM users 
WHERE user_id = SYS_CONTEXT('context_name', 'user_id'); 

我現在已經從甲骨文路程,我使用PostgreSQL爲個人項目和SQL Server 2000和2008年的工作。任何人都可以告訴我是否有相應的PostgreSQL或SQL Server提供的功能?

回答

1

在PostgreSQL中,你可能可以通過SECURITY DEFINER這個函數得到當前用戶的理由嗎?這裏記載:http://www.postgresql.org/docs/8.4/static/sql-createfunction.html

編輯:

plperl可用於session variables。還有其他的選擇(見評論中的鏈接),但plperl是最簡單的。

+0

不知道了很多關於這個細節,我認爲它使用PostgreSQL的用戶?在我描述的方法中,應用程序用戶與數據庫用戶是分開的,並使用一個公共數據庫用戶連接到數據庫。所以上下文是數據庫知道應用程序用戶連接的方式。任何方式感謝您的答案! – Sevas 2009-12-19 21:05:29

+0

啊,所以你真正想要的是會話變量? HTTP://計算器。COM /問題/ 414541 /基於會話的全局變量功能於PostgreSQL相關的存儲過程 – 2009-12-19 21:12:34

0

如果您使用pl/perl(或者如果我正確記得,則爲pl/python),您將獲得免費的會話變量。

否則 - 當使用plpgsql時,您可以使用GUC存儲您自己的設置,並以幾乎相同的方式使用它。

0

您可以使用Postgres的SET or SET LOCAL command來模擬Oracle的SET_CONTEXT(),例如,如下:

SET LOCAL audit.AUDIT_USER = 'whatever-you-like'; 
-- alternative: 
SELECT set_config('audit.AUDIT_USER', 'whatever-you-like', true); 

然後你可以檢索使用current_setting()這個值:

SELECT current_setting('audit.AUDIT_USER', true); 

(第二個參數,true,將避免異常,如果該參數不SET查詢之前,並返回NULL代替。參數在Postgres 9.6中引入,請參見how to do it in Postgres 9.1+的這個問題。)

我也創建了一個demo gist of an auditing mechanism利用SET LOCALcurrent_setting()來實現使用應用程序提供的數據進行數據庫層審覈。

最後,文件中提到的一些重要的細節,重點煤礦:

LOCAL 的SET的影響只持續,直到當前事務,是否提交或沒有結束。

(相比之下,值設定SET的會話範圍。)