2010-10-26 132 views
5

我們在Oralce上使用CR XI。我們在DB中應用RLS(行級安全性)。 RLS將基於我們在會話中設置的信息(通過調用trans_pkg.set_username('abc'))來決定哪些數據行可以出現在數據集中。但CR似乎與Oracle有自己的連接。我們無法在CR查詢數據之前運行如下所示的包:trans_pkg.set_username('abc')。 這對我們的系統來說是一個很大的安全風險。 如果您有任何解決方案,請幫助我。Crystal Report和ODP.Net

+1

在用於驅動Crystal Report的Oracle存儲過程中調用'trans_pkg.set_username('abc')'怎麼辦? – 2010-10-26 17:40:50

+0

你的意思是在CR中添加一個命令,如從雙重選擇trans_pkg.set_username('abc')?如果我們在CR中有很多查詢,每個查詢都將使用相同的Oracle會話或自行創建? – QuangND 2010-10-26 17:52:14

+0

您好OMG小馬,您的解決方案是正確的,如果查詢選擇trans_pkg.set_username('abc')雙運行首先在所有查詢。但是如何確保這個查詢總是先運行? – QuangND 2010-10-27 02:32:23

回答

0

我沒有用過反對oracle的水晶,只有sql server,但答案應該是一樣的。當您爲報告設置連線信息時,您需要指定用戶名和密碼。數據庫應使用此信息來識別用戶並分配正確的訪問權限。

+0

感謝您的回覆,我們的系統是3層,用戶數據庫對於所有會話都是相同的。唯一的方法是在查詢數據之前執行一些程序。任何建議? – QuangND 2010-10-26 17:19:52

+0

你是指在數據庫中執行'存儲過程',還是在數據訪問層中執行一個過程,或者是什麼?無論如何,這個程序是做什麼的? – Ray 2010-10-26 17:24:27

+0

執行存儲過程。我們有一個包trans_pkg。在這個包中,我們有一個全局變量g_username。 trans_pkg.set_username(p_username varchar2)只需設置g_username:= p_username;而在RLS上下文中,我們只過濾這個用戶名可以訪問的行。 – QuangND 2010-10-26 17:29:08

0

由於您使用的Crystal報表查看器,而不是一個BO服務器你可以只使用數據集作爲this answer

如果您在使用BO服務器你需要創建要求,首先要設定另一個程序用戶名,然後執行報告源程序或查詢。

+0

在我們的系統中,用戶可以創建新的rpt文件並上傳到報告服務器,其他人可以查看這些報告。在一個rpt文件中,有各種查詢。我認爲我們可以在這種情況下使用這種方法。 – QuangND 2010-10-26 18:10:19

+0

:)對不起,我是這個論壇的新手。我會找到辦法做到這一點:) – QuangND 2010-10-27 01:19:12