Awoldeselassie Ответов: 1

триггер для проверки дубликата записи


Привет всем, снова вернулся, на этот раз с вопросом SQL.

У меня есть следующий триггер SQL, чтобы предотвратить дублирование записи.

go
create trigger insAssset
on tblAssets
for insert
as

begin 
		
		if exists(
		
			select A.ARNumber
			from tblAssets as A
			inner join inserted as N
			on A.AssetID=N.AssetID
		where
			A.ARNumber=N.ARNumber
		)		
			begin
			print 'The asset already exist in the database'
			rollback transaction
			return
			end
		else 
			commit transaction 
			print 'Asset added to the database.'
		
end	


Однако этот триггер предотвращает любую запись в базу данных, даже если запись не существует.
Что я делаю не так? любое предложение было бы очень ценно.

Herman<T>.Instance

что вы видите в SSMS, когда выполняете только инструкцию SELECT, а не триггер?
Как он может сравниться с новым значением?

Awoldeselassie

Вот чего я надеялся достичь
каждый актив имеет уникальный AR-номер. при вводе новой записи скрипт должен сравнить новый AR-номер с базой данных. если он существует, то сообщите пользователю, что он существует, и откатитесь назад. если нет, то совершите.
Однако, даже если номер AR не существует, я получаю сообщение "актив уже существует в базе данных", и транзакция заканчивается в триггере.
при выполнении только SELECT он работает нормально, так как не включает триггер.

Herman<T>.Instance

А что, если результат вашего выбора равен нулю?
Был ли уже установлен N. AssetID?
Вам действительно нужен триггер, чтобы проверить это, или вы можете исправить это в хранимой процедуре или функции?
Вставляется ли другая таблица, чем tblAssets? --> Может ли соединение функционировать должным образом?

Awoldeselassie

если выбрать результат имеет значение null, возвращается значение null
AssetID identity (1,1) установлен на, он автоматически присваивает уникальный идентификатор
Я не знаю, как я могу достичь того же результата с proc. поскольку он не может быть вызван в ответ на событие. если вы знаете другой способ достижения того же результата, я был бы признателен вам за помощь.
такие таблицы, как inserted, deleted, временно создаются SSMS для управления при выполнении INSERT или DELETE. вы можете временно обратиться к таблицам, чтобы проверить наличие условий.

1 Ответов

Рейтинг:
11

ZurdoDev

Вы присоединяетесь к вставленной таблице на AssetID, что означает, что вы не просто хотите увидеть, что ARNumber уникален, но что должно быть совпадение для AssetID.

Проще всего не использовать триггеры, а просто наложить уникальное ограничение на столбец. Тогда SQL справится с этим за вас.

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

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

Идите с уникальным ограничением.


Awoldeselassie

Спасибо за ваш ответ.
Как вы уже сказали, гораздо проще использовать уникальное ограничение. Но я не понимаю, почему многие люди предпочитают избегать триггеров все вместе, когда триггеры более гибкие.