簡體   English   中英

從 MS Access VBA 前端在 SQL 中使用 SESSION_CONTEXT

[英]Using SESSION_CONTEXT in SQL from an MS Access VBA frontend

我正在將 MS Access 后端數據庫遷移到 SQL 服務器。

需要保留現有的 MS Access 前端。

我使用服務帳戶將 Access 前端連接到 SQL 數據庫,以便單個用戶無法直接訪問 SQL。

我想記錄 UserId 的添加和更新操作,但我不想在每次調用時都指定字段。

我在 Access 中打開了一個隱藏表,以保持與 SQL 數據庫的持久連接。

我使用 Access 啟動時調用的 Sub 在 Access 中創建了一個帶有 UserId 的 Session Context 對象,我什至在運行記錄插入之前直接調用了 Sub。

Sub SqlSetUser()
Dim qdef As DAO.QueryDef

Set qdef = CurrentDb.CreateQueryDef("")
qdef.Connect = CurrentDb.TableDefs("dbo_User").Connect
qdef.SQL = "EXEC sys.sp_set_session_context @key = N'UserId', @value = '" & GetUser() & "';"
qdef.ReturnsRecords = False  ''avoid 3065 error
qdef.Execute

End Sub

我在 SQL 表中創建了一個觸發器來提取 UserId 並將其添加到使用類似觸發器添加的記錄中以處理更新;

CREATE   TRIGGER [dbo].[ReferenceItemAdd]
on [dbo].[ReferenceItem]
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;
    declare @UserId as int = try_cast((Select SESSION_CONTEXT(N'UserId')) as int)
    UPDATE ReferenceItem set AddDate = getdate(), AddUserId = @UserId
    from INSERTED i, ReferenceItem a
    where i.ReferenceItemId = a.ReferenceItemId
    SET NOCOUNT OFF;
END

僅在我通過斷點停止代碼然后繼續時才有效 如果我允許代碼運行,則插入記錄,並且觸發器正確設置了 AddDate,但 UserId 返回 NULL。

如何從 MS-Access 前端為 MS-SQL 中的觸發器訪問 UserId?

我不明白你關於提高安全性的筆記?

如果您有一個客戶端 Web 瀏覽器和一個 Web 服務器,那么您當然有一個可以使用服務帳戶更新 SQL 數據庫的 Web 服務器,因為在客戶端和 SQL 數據庫之間有一個完整的 Web 服務器。

您沒有上述任何一項。

例如:

qdef.Connect = CurrentDb.TableDefs("dbo_User").Connect
qdef.SQL = "EXEC 

對,所以你有鏈接表,上面是一個直接命中數據庫的連接字符串,甚至可以執行存儲過程。 我假設此連接與鏈接表使用的連接相同? (無論如何,我們可以把所謂的安全問題留待一天——你這里有的是平面 jane 鏈接表,它們直接更新數據庫,甚至能夠按照上面的例子執行存儲過程代碼。

接下來:

我們假設這里使用了一個 SQL 登錄?

你的代碼應該可以工作,看起來不對的是:

declare @UserId as int = try_cast((Select SESSION_CONTEXT(N'UserId')) as int)

你為什么將上述內容轉換為 int? 你不是GetUser()設置了一個字符串嗎? (您的示例代碼在文本周圍有 ' ' - 因此它假定為字符類型。

它是一個直接的變量賦值——你不需要選擇。

你應該使用:

 DECLARE @UserID as varchar(25) = CAST(SESSION_CONTEXT(N'UserId') AS varchar(25))

我不知道所有鏈接表的會話是否會保持不變。 我會 100% 確保所有鏈接表都具有完全相同的連接字符串。 您應該能夠在啟動時執行一次代碼以設置該會話值。 但是,我不能 100% 確定這里將始終使用單個會話(您可以回來確認這一點 - 如果是這種情況,我很感興趣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM