Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2015, 16:24   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
Восклицание SQL, триггер

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

Код:
ALTER TRIGGER [dbo].[insert_trigger]
ON [dbo].[LOODSMANS2] 
INSTEAD OF INSERT
AS
MERGE LOODSMANS2 AS l2 
USING inserted AS i 
ON l2.FID = i.FID and l2.OBJTYPENAME = i.OBJTYPENAME
WHEN MATCHED THEN
UPDATE SET l2.FID = l2.FID
WHEN NOT MATCHED THEN
INSERT (FID, OBJTYPENAME) VALUES (i.FID, i.OBJTYPENAME);
GO
Вроде разобрался в коде, всё понял. Пытаюсь это дело в sql сервере запустить и тут началось. Сперва ругань на merge, ладно, убрал. Потом на using, тоже убрал. И т.д. Так и не смог окончательно разобраться. Подозреваю, что дело в версии студии
(у меня Microsoft SQL Server 2008 R2 и вот такие данные о версиях
Microsoft SQL Server Management Studio 10.50.1617.0
Microsoft Analysis Services Client Tools 10.50.1617.0
Microsoft Data Access Components (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 4.0 6.0
Microsoft Internet Explorer 8.0.7601.17514
Microsoft .NET Framework 2.0.50727.5485
Operating System 6.1.7601)

Уважаемые форумчане, подскажите, как в моей версии реализовать то, что необходимо. Заранее благодарю!
nactyx вне форума Ответить с цитированием
Старый 12.05.2015, 11:47   #2
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

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

Всё забывал поделиться на форуме.

Вот работающий и целиком и полностью устраивающий меня вариант:

Код:
ALTER TRIGGER [dbo].[trigger1]
	ON [dbo].[LOODSMANS2] INSTEAD OF INSERT
AS
	IF NOT EXISTS(SELECT top 1  * from [dbo].[LOODSMANS2] where fid = (select fid from inserted) and objtypename = (select objtypename from inserted))
	BEGIN
			INSERT INTO [dbo].[LOODSMANS2] 
			SELECT * FROM inserted
			RETURN
	END
COMMIT TRAN
RETURN
nactyx вне форума Ответить с цитированием
Старый 12.05.2015, 12:13   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Почему бы не облегчить запрос проверки
Код:
IF NOT EXISTS(SELECT 0 from [dbo].[LOODSMANS2] U,inserted I where U.fid = I.fid AND U.objtypename = I.objtypename)
1. Для группового инсерта этот триггер не пригоден
2. Он все равно не дает гарантии от дублей - после проверки и перед вставкой от другого пользователя может прийти аналогичный инсерт и отработать в этом промежутке. Уникальный индекс по этим полям или составной первичный ключ не позволит 100% этого
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
T-SQL Триггер на Update Tab1 xxbesoxx SQL, базы данных 14 21.03.2015 20:19
триггер в SQL Apoka5555 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 5 18.10.2013 00:33
Sql. Триггер VAVILON17 Помощь студентам 4 10.01.2013 00:21
Триггер для БД на SQL Sayks Помощь студентам 1 20.04.2012 14:04