1

當前的用戶名我有兩個表獲取登錄的用戶在asp.net默認的成員資格提供

Employee (EmpID, Name, UpdatedBy, UpdateDate) 
EmpContact (ContactID, Contact,EmpID) 

我想創建一個觸發器,它更新一個Employee表中的字段UpdatedBy,UpdateDate。當添加或修改聯繫人時,我想更新員工的UpdatedBy and UpdateDate字段(這兩個表具有不同的asp.net-mvc視圖)。 我正在使用默認成員資格提供程序來驗證用戶。
所以我的問題是如何我可以得到觸發誰啓動插入,更新或刪除當前登錄用戶。有沒有什麼辦法可以知道哪些asp.net用戶ID TRIGGER內發起的交易

+0

請澄清:你想知道如何創建一個SQL-Server觸發器,更新您的EmpContact記錄創建(編輯,刪除)時的員工表? –

+0

是的,但主要問題是如何獲取當前的用戶代碼修改已完成的useID。該用戶標識不是數據庫用戶,而是登錄的成員資格提供者用戶 – Tassadaque

回答

2

創建一個插入/更新/刪除觸發器更新Emplyoee表EmpContact記錄被創建時/更新/刪除,例如(插入):

CREATE TRIGGER [dbo].[trgCreateEmpContact] ON [dbo].[EmpContact] 
FOR INSERT 
AS 

UPDATE dbo.Employee 
SET UpdateDate=GetDate(), UpdatedBy = I.UpdatedBy 
FROM Employee E 
INNER JOIN Inserted I ON E.EmpID = I.EmpID 

因此您需要將UpdatedBy列添加到您的EmpContact表中。

你得到的當前登錄的用戶以下列方式:

MembershipUser currentUser = Membership.GetUser(); 
GUID currentUserID = (GUID)currentUser.ProviderUserKey; 

另一個(更好)的方法是創建一個存儲過程在內部創建EmpContact記錄,並在事務更新Employee表,例如(未經測試):

CREATE PROCEDURE [dbo].[InsertEmpContact] 
    @ContactID int OUTPUT, 
    @Contact varchar(50) OUTPUT, 
    @EmpID int OUTPUT, 
    @UpdateDate datetime OUTPUT, 
    @UpdatedBy int OUTPUT, 
with execute as Owner 
AS 
BEGIN TRANSACTION 

INSERT INTO EmpContact(Contact, EmpID) 
VALUES  (@Contact,@EmpID) 

;SELECT @ContactID=ContactID,@Contact=Contact,@EmpID=EmpID,@UpdateDate=GetDate() 
FROM EmpContact WHERE (ContactID = SCOPE_IDENTITY()) 

;UPDATE dbo.Employee 
SET [email protected], UpdatedBy = @UpdatedBy 
WHERE EmpID = @EmpID 

IF @@ERROR <> 0 
BEGIN 
    -- Rollback the transaction 
    ROLLBACK 
    RETURN 
END 

COMMIT 
+0

嗯所以我必須在EmpContact中添加UpdatedBy列。我正在尋找一種避免這種情況的方法。如果這是最後一招我會做 – Tassadaque

+0

@Tassadaque:編輯我的答案,並提供一種方法來避免這種情況。創建一個SP用於插入/編輯和刪除在事務內部更新員工表的記錄。這將是最健壯和可讀的解決方案。無論如何,觸發器在背景中常常是太多的魔法。 –

+0

謝謝,但我正在使用實體框架插入寫我自己的插入過程不是我的選擇此刻:( – Tassadaque

0

這取決於您的應用程序如何連接到您的數據庫。如果你這樣做,就像我們幾乎所有人一樣,連接池和單個用戶連接到數據庫,答案是否定的,你不能在觸發器中知道。

例如該應用程序連接到數據庫作爲sa/pwd(不建議,但僅供參數使用)。

如果用戶一(Paul)連接到數據庫並進行更新,您的觸發器將以用戶身份得到sa。 如果用戶2(Anne)連接到數據庫,觸發器也會以用戶身份獲取sa。

所以你需要在更新statmement用戶的更新(或作爲參數傳遞給您的存儲過程)

相關問題