2012-12-01 93 views
4

我試圖找出「正確」的方式來建立從我的DataSnap應用程序的服務器到我的數據庫的連接。的DataSnap和數據庫連接/登錄

數據庫中的每個表(大多數)都有字段(其值是通過插入和更新的觸發器設置的)稱爲Updated和Created(這是寫入記錄時的當前時間戳記)以及updated_by和created_by哪個(應該)包含當前登錄的用戶。

我希望用戶從客戶端「登陸」,使得這些領域的反映誰已登錄的用戶(通過擴展,我會從數據庫中獲取用戶身份驗證,而不是從服務器)。我能處理的認證服務器本身從客戶機確定處理服務器上的OnUserAuthenticate和OnUserAuthorize事件。我試圖然後將憑據傳遞到我的數據庫,以便觸發器可以正確設置上述字段。

那麼,什麼是解決這個場景的方式嗎?我不知道來自客戶端的DSAuthProxyUser和DSAuthProxyPassword可以使用,但我找不到太多(有)我將如何使用該文檔。我是否爲每個連接用戶建立新連接?這對我來說似乎最合乎邏輯。我不會有很多併發用戶。上衣30.最有可能5-10。但是,這是做什麼「正常」的方式?我不希望(希望我不必)將用戶名傳遞給每個插入/更新以設置表中的值。

我希望我已經解釋清楚我的處境。

感謝

回答

2

我還沒有使用過,但在我看來,在火鳥2推出RDB$SET_CONTEXT()RDB$GET_CONTEXT()是你所需要的。使用此功能,您可以設置(並獲取)特定於用戶會話(名稱空間USER_SESSION)或當前事務(名稱空間USER_TRANSACTION)的其他信息。您還可以檢索當前會話的其他系統信息(命名空間SYSTEM),但這可能與您的案例無關。

你需要做的是使用(如查詢)調用該OnUserAuthorize事件RDB$SET_CONTEXT()方法,如:

SELECT RDB$SET_CONTEXT('USER_SESSION', 'actualuser', '<name of user') 
FROM RDB$DATABASE 

這裏'actualuser'是我們使用的上下文變量。在你的觸發器可以再檢索的名稱(假定PSQL,以聲明的變量actualuser

actualuser = RDB$GET_CONTEXT('USER_SESSION', 'actualuser'); 

然後,您可以在您的觸發器的其餘部分使用actualuser。只要確保你也考慮到沒有設置上下文變量的情況(例如管理員直接更改數據庫或類似的東西)。

+0

我想人們也可以寫'dummy_result = RDB $ SET_CONTEXT( 'USER_SESSION', 'actualuser', '用戶的<名')'? – mjn

+0

在PSQL你甚至可以不用來分配根據文檔的變量:「由於它的UDF般的性質,RDB $ SET_CONTEXT可以 - 在PSQL唯一的 - 被稱爲像一個空函數」。但是,從SQL運行時,您需要將其作爲針對'RDB $ DATABASE'的查詢來執行。 –

+0

完美。謝謝!我可以根據需要做這件事。 – Jason

1

Firebird具有可在SQL中使用的CURRENT_USER關鍵字。

下面的例子是基於http://www.firebirdsql.org/refdocs/langrefupd15-current_user.html

create trigger bi_customers for customers before insert as 
begin 
    New.created_by = CURRENT_USER; 
end 

要具有更新的用戶名,只需更新觸發之前聲明一個像

create trigger bi_customers for customers before update as 
begin 
    New.updated_by = CURRENT_USER; 
end 

這種解決方案需要一個1:數據庫1映射用戶到外部用戶。在最簡單的實現中,這意味着DataSnap會話根據數據庫驗證用戶憑證。

在你的描述然而,它似乎是一個兩步鑑別(第一抵靠的DataSnap層,然後對數據庫)。我不知道如何能有關安全密碼處理來完成的,如果你計劃有一個獨立的用戶名/密碼錶只用於第一認證階段(的DataSnap)和的DataSnap用戶登錄映射到數據庫作爲某種「脫鉤」。

+0

據我明白OP,有數據庫連接的用戶(這是'CURRENT_USER')和應用程序的邏輯用戶之間的差異。 OP想要記錄該應用程序的邏輯用戶,而不是數據庫連接的用戶。 –

相關問題