2012-03-01 25 views
2

我有一個Windows窗體應用程序和它的Customers表和DB中的相應表(Customer)。當編輯WinForm表格並單擊保存按鈕時,stored procedure執行並更新DB中的Customer表格。當表更新時,執行一個trigger。爲了記錄目的,Trigger執行一些stored procedure並將數據保存到日誌表中。我需要通過Environment.UserName到日誌表中,而不保存在Customer表中,即我必須將它傳遞到最終的日誌表,但我不能將它作爲列添加到Customer表中。我不知道該怎麼做。有沒有辦法做到這一點。如何將臨時數據從觸發器傳遞到SQL Server 2008中的存儲過程

謝謝。

回答

3

您可以在連接上下文中存儲用戶名(將其編碼爲varbinary)。

DECLARE @a VARBINARY(128) 
    SET @a = CAST('myuser' AS VARBINARY(128)) 
    SET CONTEXT_INFO @a 

其中@a包含編碼的用戶名。在觸發器中,您可以使用函數CONTEXT_INFO()獲取上下文信息並將其解碼爲varchar。

SELECT cast(CONTEXT_INFO() as VARCHAR(128)) 
+0

如果我從Management Studio調用CONTEXT_INFO(),它將返回NULL? – Arterius 2012-03-01 10:51:51

+0

連接上下文僅在原始連接中可用。所以如果你沒有做'SET CONTEXT_INFO',它確實會返回null。 – 2012-03-01 10:52:45

+0

謝謝!我認爲這種方法是我的唯一可能的方式。 – Arterius 2012-03-01 10:57:33

1

我不確定傳遞參數給觸發器是個好主意。

請考慮在觸發體中使用suser_sname()函數來識別用戶。

另一種選擇是將邏輯從觸發器移動到存儲過程,並將有關cuurent用戶的信息傳遞給存儲過程。

+1

同意,但在我的情況下,suser_sname()返回用戶名'sa'而不是windows用戶名。 – Arterius 2012-03-01 08:04:34

+1

使用'sa'帳戶連接到數據庫違反了很少的安全規則,但我完全理解,有時候大型重構的成本對於項目贊助商來說很高。也許有一些選項適用於'host_name()'函數,該函數爲您提供有關用戶工作站名稱的信息。 – Radek 2012-03-01 08:14:09

相關問題