1

有一個本地FOX應用程序連接到SQL Server數據庫。有一個在數據庫中的觸發器節省樣改變db表:通過SQL服務器觸發器保存贏得用戶名

INSERT INTO dbo.UpdateContract 
SELECT 'OLD' RecordType,USER,SYSTEM_USER,@Time, (...) 

我正在開發的.NET(C#)相同的應用程序,不知道如何使用相同的觸發保存名稱的用戶誰登錄到我的.NET應用程序(或Windows用戶)。 我可以使用靜態CS像

SqlConnection sqlConn = new SqlConnection("Server=servername;Database=dbname;User Id=dbuser;Password=Pass;"); 

(但肯定的是,觸發保存此用戶名,而不是應用程序的用戶名) 或者這個CS:

SqlConnection sqlConn = new SqlConnection("Data Source=servername; Initial Catalog=dbname; Integrated Security=SSPI;"); 

(但在這種情況下,觸發使用服務器機器名稱)

+0

您可以將應用程序用戶名傳遞給該INSERT嗎? – Danyu

+1

SSPI應以「Domain \ User」格式返回用戶。創建與您的應用登錄匹配的SQL登錄。 –

+0

Danyu,你的意思是將應用程序登錄的用戶名傳入sql查詢,而不是編輯觸發器並使用這個傳遞的名字?嗯,它可以工作...對於刪除觸發器可能會有點困難.. – Petr

回答

1

您可以在CREATE TABLE和ALTER TABLE語句中將DEFAULT約束使用SYSTEM_USER函數。您也可以將其用作任何標準功能。

如果用戶名和登錄名不同,SYSTEM_USER將返回登錄名。

如果當前用戶使用Windows身份驗證登錄到SQL Server,SYSTEM_USER將以下列格式返回Windows登錄標識名:DOMAIN \ user_login_name。但是,如果當前用戶使用SQL Server身份驗證登錄到SQL Server,則SYSTEM_USER會爲以WillisJo身份登錄的用戶返回SQL Server登錄標識名稱,例如WillisJo。

SYSTEM_USER返回當前正在執行的上下文的名稱。如果EXECUTE AS語句已用於切換上下文,則SYSTEM_USER將返回模擬的上下文的名稱。

您的「非C#版本」有可能冒充上下文。連接到服務器後,您可以應用此連接:

EXECUTE AS USER = 'YourWindowsUsername'; 

應該切換上下文。我不確定這是否是正確的方法,您可能需要添加新字段以觸發:CURRENT_USER,這可能是您需要的。

來源:http://msdn.microsoft.com/en-us/library/ms176050(v=sql.105).aspx