Удалить запись при обновлении записи в другой таблице - PullRequest
0 голосов
/ 01 ноября 2019

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

  • UserActivationCode UA
  • User U

При использовании отправить введите код активации, янеобходимо проверить код в UA;если он существует, перейдите к User и обновите столбец IsActive = true, а если IsActive имеет значение true, вернитесь к UserActivationCode и удалите запись UserCode.

Я написал этот код:

UPDATE [User] 
SET IsActive = 1 
FROM [User] U 
JOIN [UserActivationCode] UA ON U.Email = UA.Username 
WHERE UA.Username = @Username 
  AND UA.ActivationCode=  @ActivationCode 
  AND UA.ExpireTime < GETDATE() 
  AND U.IsActive = 0

но что я должен изменить свой код для возврата и удалить запись в UserActivationCode?

Ответы [ 4 ]

2 голосов
/ 01 ноября 2019

Вы можете использовать оператор слияния здесь

DECLARE @T TABLE(Username VARCHAR(100));

MERGE [User] AS U
USING [UserActivetionCode] AS UA 
ON (U.Email = UA.Username AND UA.Username = @Username AND UA.ActivetionCode=  @ActivetionCode AND UA.ExpireTime < GETDATE() AND U.IsActive = 0) 
WHEN MATCHED
   THEN UPDATE SET U.IsActive = 1 
WHEN NOT MATCHED BY SOURCE AND 1 < 0
   THEN DELETE UA.Username INTO @T;


DELETE FROM [UserActivetionCode] WHERE UA.Username NOT IN(SELECT Username FROM @T) 
1 голос
/ 01 ноября 2019

Вы можете добавить IF EXISTS условие на вашем TSQL.

IF EXISTS(SELECT 1 FROM [User] t1
    JOIN [UserActivetionCode] t2 t1.Email = t2.Username 
    WHERE  UA.Username = @Username AND UA.ActivetionCode=  @ActivetionCode 
        AND UA.ExpireTime < GETDATE() AND U.IsActive = 0)
BEGIN
    UPDATE [User] SET IsActive=1 FROM [User] U JOIN [UserActivetionCode] UA ON 
    U.Email=UA.Username WHERE UA.Username = @Username AND UA.ActivetionCode=  @ActivetionCode 
    AND UA.ExpireTime < GETDATE() AND U.IsActive = 0

    DELETE FROM [UserActivetionCode] WHERE  UA.ActivetionCode=  @ActivetionCode 
END
0 голосов
/ 01 ноября 2019

Следующий код делает некоторые предположения, поскольку вы не предоставили DDL для своих таблиц. Он оборачивает работу в транзакции, чтобы сделать операцию атомарной (при условии подходящего уровня изоляции транзакции).

begin transaction;

declare @UserCodes as Table ( UserCode Int );

UPDATE [User] 
SET IsActive = 1 
-- Capture the   UserCode   of any affected rows.
output inserted.UserCode into @UserCodes
FROM [User] U 
JOIN [UserActivationCode] UA ON U.Email = UA.Username 
WHERE UA.Username = @Username 
  AND UA.ActivationCode = @ActivationCode 
  AND UA.ExpireTime < GETDATE() 
  AND U.IsActive = 0;

-- If any rows were updated then delete the corresponding   UserActivationCode   row(s).
delete from UserActivationCode 
  where UserCode in ( select UserCode from @UserCodes );

commit transaction;
0 голосов
/ 01 ноября 2019
CASE 
WHEN EXISTS(SELECT 1 FROM UserActivationCode UA JOIN User U 
    ON UA.Username = U.Email
    WHERE UA.Username = @Username
    AND UA.ExpireTime < GETDATE() 
    AND U.IsActive = 0)
THEN
    UPDATE [User] 
    SET IsActive = 1 
    FROM [User] U JOIN [UserActivationCode] UA ON U.Email = UA.Username 
    WHERE UA.Username = @Username 
      AND UA.ActivationCode=  @ActivationCode 
      AND UA.ExpireTime < GETDATE() 
      AND U.IsActive = 

ELSE
    DELETE FROM [UserActivetionCode] WHERE  UA.ActivetionCode=  @ActivetionCode  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...