Вставной триггер не работает должным образом - PullRequest
0 голосов
/ 19 сентября 2009

Я создал следующий триггер для вставки в таблицу удаленных пользователей, соответствующая запись должна быть удалена из таблицы userlogin.

Триггер включает в себя следующие операторы:

CREATE TRIGGER trgInsert_ToDeleteFromUserLogin on DELETEDUSER
FOR INSERT
AS

BEGIN

DECLARE
@UserName nvarchar(50),
@UserType nvarchar(30),
@Reason nvarchar(max)

SELECT @UserName = USERNAME, @UserType = UserType, @Reason = Reason FROM INSERTED 
INSERT INTO DELETEDUSER (USERNAME,USERTYPE,REASON) VALUES(@USERNAME,@USERTYPE,@REASON)
DELETE FROM USERLOGIN WHERE USERNAME = @UserName

end

Но когда я вставляю запись в таблицу удаленных пользователей, соответствующая запись удаляется из таблицы userlogin, но не добавляется в таблицу удаленных пользователей.

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

Для справки, я включаю структуру таблицы для удаленного пользователя и userlogin следующим образом:

Deleted User

CREATE TABLE DELETEDUSER
(
DeletedUserID int identity(1,1),
UserName nvarchar(max),
UserType nvarchar(30),
Reason nvarchar(max)
)

--ALTERING DELETEDUSER TABLE TO SPECIFY THE SIZE OF USERNAME COLUMN FOR IMPOSING FOREIGN KEY CONSTRAINT

ALTER TABLE DELETEDUSER ALTER COLUMN UserName nvarchar(50)

--ALTERING DELETEDUSER TABLE TO ADD FOREIGN KEY CONSTRAINT

ALTER TABLE DELETEDUSER ADD CONSTRAINT fk_UserName Foreign key (UserName) references UserLogin(UserName) on delete cascade


USERLOGIN TABLE:

CREATE TABLE USERLOGIN
(
UserID int identity(1,1) not null,
UserName nvarchar(50) not null,
Password nvarchar(50) not null
)

--ALTER TABLE USERREGISTRATION TO ADD PRIMARYKEY

ALTER TABLE USERLOGIN ADD CONSTRAINT pk_UserName primary key(UserName)

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

Заранее спасибо!

Ответы [ 3 ]

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

Ваш триггер является триггером «ПОСЛЕ» (по умолчанию), а не «ВМЕСТО». С помощью триггера AFTER уже «дело сделано», т. Е. Вставка в DeletedUser уже произошла, поэтому вам не нужен оператор INSERT.

Отношения внешнего ключа между DeletedUser и UserLogin просто неверны. Эти таблицы, из того, что вы описали, взаимоисключающие : наличие пользователя в DeletedUser означает, что его больше не должно быть в UserLogin, а наличие пользователя в UserLogin означает, что они также не будут DeletedUser.

Итак, удалите отношение внешнего ключа и попробуйте это:

CREATE TRIGGER trgInsert_ToDeleteFromUserLogin on DELETEDUSER FOR INSERT AS
BEGIN
  DELETE FROM UserLogin WHERE EXISTS (SELECT NULL FROM INSERTED WHERE
    INSERTED.USERNAME = UserLogin.USERNAME)
END

Редактировать: как Шеннон упомянул ниже, этот код будет правильно обрабатывать ситуации, когда несколько записей вставляются одновременно, в отличие от предположения об исходном коде из одной строки. Вариант использования (отключение пользователя) предлагал только одну вставку за раз, но лучше (и проще) создавать триггеры для работы со всем набором записей во вставленных / удаленных метатаблицах.

Кроме того, ваша база данных может быть упрощена с помощью представлений. Пример:

ALTER TABLE UserLogin ADD DeletedReason varchar(255) NULL

CREATE VIEW ActiveUser AS SELECT * FROM UserLogin WHERE DeletedReason IS NULL
0 голосов
/ 19 сентября 2009

Ваш триггер написан при условии, что во вставленной таблице будет только одна строка. В SQL нет триггеров строк (как в Oracle), триггеры запускаются один раз для оператора, а для вставленных / удаленных таблиц оператор всех строк будет затронут

SELECT @UserName = ИМЯ ПОЛЬЗОВАТЕЛЯ, @UserType = UserType, @Reason = Причина ОТ ВСТАВЛЕНО

Что будет здесь, если в один оператор будет вставлено 4 строки?

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

Для хорошего ознакомления с триггерами в SQL, пожалуйста, прочитайте это: http://www.sqlservercentral.com/articles/Triggers/64214/

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

Почему вы вставляете в DeletedUser в триггере INSERT на DeletedUser? Это уже происходит, потому что это то, что спустило курок в первую очередь. Удалите эту часть, и все должно быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...