1

두 테이블asp.net 기본 멤버 자격 공급자에서 현재 로그인 한 사용자의 UserID 가져 오기

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

UpdatedBy,UpdateDate Employee 테이블 필드를 업데이트하는 트리거를 만들려고합니다. 연락처가 추가되거나 수정되면 Employee의 UpdatedBy and UpdateDate 필드를 업데이트하려고합니다.이 두 테이블은 asp.net-mvc 뷰가 다릅니다. 기본 인증 공급자를 사용하여 사용자를 인증하고 있습니다.
그래서 내 질문은 내가 삽입, 업데이트 또는 삭제를 시작한 트리거에서 현재 로그인 한 사용자를 얻을 수있는 방법입니다. 어떤 asp.net 사용자 ID가 TRIGGER 내에서 트랜잭션을 시작했는지 알 수있는 방법이 있습니까?

+0

명확히 사항 :이 업데이트하는 SQL-서버 트리거를 작성하는 방법을 알고 싶어 당신의 EmpContact 레코드가 생성 (편집, 삭제) 될 때 직원 테이블?! –

+0

네,하지만 주된 문제는 수정이 이루어진 대신 현재 loggin useID를 얻는 방법입니다. 해당 사용자 ID는 데이터베이스 사용자가 아니라 로그인 한 멤버십 공급자 사용자입니다. – 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 

따라서 EmpContact 테이블에도 UpdatedBy 열을 추가해야합니다.

하여 현재는 다음과 같은 방법으로 로그인 한 사용자가 얻을 :

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)가 db에 연결하여 업데이트를 수행하면 방아쇠에 sa 사용자가 표시됩니다. 사용자 2 (Anne)가 db에 연결하면 트리거는 sa를 사용자로 가져옵니다.

그래서 당신은 업데이트 statmement에서 사용자의 업데이트를 포함해야합니다 (또는 저장 프로 시저에 인수로)

관련 문제