Получить идентификатор пользователя текущего зарегистрированного пользователя в провайдере членства по умолчанию asp.net - PullRequest
1 голос
/ 19 сентября 2011

У меня есть две таблицы

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

Я пытаюсь создать триггер, который обновляет поля таблицы Employee UpdatedBy,UpdateDate. когда контакт добавлен или изменен, я хочу обновить поля UpdatedBy and UpdateDate сотрудника (эти две таблицы имеют разные представления asp.net-mvc). Я использую провайдер членства по умолчанию для аутентификации пользователя.
Поэтому мой вопрос состоит в том, как я могу получить текущего вошедшего в систему пользователя в триггере, который инициировал вставку, обновление или удаление. Есть ли способ узнать, какой идентификатор пользователя asp.net инициировал транзакцию в TRIGGER

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Создайте триггер вставки / обновления / удаления, который обновляет таблицу 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 UpdateDate=@UpdateDate, UpdatedBy = @UpdatedBy
WHERE EmpID = @EmpID 

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

COMMIT
0 голосов
/ 19 сентября 2011

Это зависит от того, как ваше приложение подключается к вашей базе данных.Если вы сделаете это, как и почти все мы, с пулом соединений и одним пользователем, подключающимся к базе данных, ответ будет отрицательным, вы не можете знать, что в триггере.

Например, приложение подключается к базе данных какsa / pwd (не рекомендуется, но только для аргументов).

Если один пользователь (Paul) подключается к базе данных и выполняет обновление, ваш триггер получит sa как пользователь.Если пользователь два (Anne) подключается к БД, триггер также получит sa как пользователь.

Поэтому вам необходимо включить обновление пользователя в обновление обновлений (или в качестве аргумента вашей хранимой процедуры)

0 голосов
/ 19 сентября 2011

Если вы хотите обнаружить текущего зарегистрированного пользователя из членства, пожалуйста, используйте эти ссылки

http://www.codeproject.com/KB/aspnet/CustomMembershipProviders.aspx

http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-2/

...