Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/76: Рейтинг темы: голосов - 76, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 13

Отменить добавление записи через тригер

09.09.2015, 08:47. Показов 15133. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Столкнулся со следующей проблемой. В одной из таблиц заметил задвоение данных поэтому решил добавить тригер на вставку, что в случае если найдена такая запись не добавлять. написал такой код:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TRIGGER dbo.PAY_tri ON dbo.PAY
WITH EXECUTE AS CALLER
FOR INSERT
NOT FOR REPLICATION
AS
BEGIN
  /* Trigger body */
  
BEGIN TRANSACTION
 
  IF EXISTS(SELECT * FROM pay AS a, inserted AS b WHERE a.ak_id=b.ak_id )
        ROLLBACK TRANSACTION
                 
 
END
GO
, при проверке в SQL Manager Lite появляется сообщение об ошибке "Транзакция завершилась в триггере. Выполнение пакета прервано". Так как все же отменить добавление записи? На что смотреть и куда копать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2015, 08:47
Ответы с готовыми решениями:

Тригер для каждой записи
Всем привет! Смотрю примеры и справку и никак не пойму, как заставить тригер выполняться не для всх записей разом, а для каждой...

Тригер записи или обновления таблицы
Есть запись из двух в одну таблицу. --Вставка в общую БД insert into Piramida2000.dbo.data (PARNUMBER, OBJECT, ITEM, VALUE0, VALUE1,...

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

20
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 08:49
добавить уникальный индекс и ловить исключение на клиенте
0
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 13
09.09.2015, 09:03  [ТС]
а как без доработак клиента обойтись, решить внутри базы?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 09:20
раскуривай Instead of insert trigger
https://technet.microsoft.com/... 05%29.aspx
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
09.09.2015, 09:48
Цитата Сообщение от Alexandr-23 Посмотреть сообщение
Здравствуйте.
Столкнулся со следующей проблемой. В одной из таблиц заметил задвоение данных поэтому решил добавить тригер на вставку, что в случае если найдена такая запись не добавлять. написал такой код:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TRIGGER dbo.PAY_tri ON dbo.PAY
WITH EXECUTE AS CALLER
FOR INSERT
NOT FOR REPLICATION
AS
BEGIN
  /* Trigger body */
  
BEGIN TRANSACTION
 
  IF EXISTS(SELECT * FROM pay AS a, inserted AS b WHERE a.ak_id=b.ak_id )
        ROLLBACK TRANSACTION
                 
 
END
GO
, при проверке в SQL Manager Lite появляется сообщение об ошибке "Транзакция завершилась в триггере. Выполнение пакета прервано". Так как все же отменить добавление записи? На что смотреть и куда копать?
Триггер FOR (AFTER) INSERT запускается ПОСЛЕ вставки, когда записи уже находятся в таблице.
Поэтому IF EXISTS() в вашем корявом скрипте с древней запятой во FROMе выполнится всегда.

Присоединяюсь, однако, к мнению, что триггер тут не нужен.
Хотя, можно, конечно, попробовать триггер INSTEAD OF INSERT...
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
09.09.2015, 10:26
Цитата Сообщение от Alexandr-23 Посмотреть сообщение
В одной из таблиц заметил задвоение данных поэтому решил добавить тригер на вставку,
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
create database DB1;
----------------
use DB1
----------------------
create table Tab1(t_id int identity(1,1),
                  t_name nvarchar(30)
                  )
-----------------------
--drop table Tab2
create table Tab2(t_id int,
                  t_name nvarchar(30)
                  )
----------------------
insert into Tab1(t_name) values(N'Чай');
insert into Tab1(t_name) values(N'Кофе');
insert into Tab1(t_name) values(N'Сахар');
-----------------------
/*Триггер проверяеть при инсерте из Tab1 на Tab2 !
 Если есть такой запись уже на Tab2 НЕ встравляем ROLLBACK TRAN */
CREATE TRIGGER TR_INSERT_COUNT
ON Tab2
AFTER INSERT
AS
IF (SELECT COUNT (*) FROM Tab2 T inner join inserted I on T.t_id=I.t_id)>1
BEGIN
ROLLBACK TRAN
 PRINT N'Такой запись уже есть на Tab2'
END
Цитата Сообщение от iap Посмотреть сообщение
Хотя, можно, конечно, попробовать триггер INSTEAD OF INSERT...
Так можно ?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 10:29
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Так можно ?
можно, только отравишься (с) "Спортлото 82"
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
09.09.2015, 10:39
Цитата Сообщение от pincet Посмотреть сообщение
только отравишься (с) "Спортлото 82"
"Спортлото 82" я не знаю что это что не так ? Я магу так проверить на любом полей , на пример

T-SQL
1
2
3
IF (SELECT COUNT (*) FROM Tab2 T inner join inserted I on T.t_name=I.t_name продолжать  AND ....  OR )>1
BEGIN
ROLLBACK TRAN
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
09.09.2015, 10:49
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Так можно ?
Что мешает создать уникальный констрейнт или уникальный индекс для поля t_id?
В индексе можно даже задать опцию "игнорировать дубли" (правда тогда будет возвращаться warning).
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 10:54
Цитата Сообщение от iap Посмотреть сообщение
Что мешает создать уникальный констрейнт или уникальный индекс для поля t_id?
думаю, отсутствие доступа к исходникам клиента
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
09.09.2015, 11:01
Цитата Сообщение от iap Посмотреть сообщение
Что мешает создать уникальный констрейнт или уникальный индекс для поля t_id?
Нечего можно ! Но , я с этим print или
T-SQL
1
2
  RAISERROR ('Такой запись уже есть на Tab2',
                                    16, 127)
SQL
1
PRINT N'Такой запись уже есть на Tab2'
могу сообщить ("оператору"-имею в виду кто работает из графический приложений ) что уже есть такой "Вася" в таблице
0
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 13
09.09.2015, 11:13  [ТС]
Всем спасибо решил проблему так
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TRIGGER dbo.PAY_tri ON dbo.PAY
WITH EXECUTE AS CALLER
INSTEAD OF INSERT
NOT FOR REPLICATION
AS
BEGIN
  /* Trigger body */
IF (NOT EXISTS (SELECT * FROM pay AS a, inserted AS b WHERE a.ak_id=b.ak_id AND a.ptv_id=b.ptv_id AND 
             a.rt=b.rt AND a.db=b.db AND a.u_id=b.u_id AND a.r_id=b.r_id AND a.IPAY_ID=b.IPAY_ID AND
             a.ipay_detail_id=b.ipay_detail_id AND a.rdp_id=b.rdp_id))
   INSERT INTO pay (ak_id, ptv_id,rt, db, u_id, r_id, a.IPAY_ID,ipay_detail_id, rdp_id)
    SELECT ak_id
    FROM inserted
    
ELSE
   UPDATE pay 
      SET ak_id = b.ak_id
   FROM pay a, inserted b
   WHERE a.ak_id = b.ak_id AND a.ptv_id=b.ptv_id AND 
         a.rt=b.rt AND a.db=b.db AND a.u_id=b.u_id AND a.r_id=b.r_id AND a.IPAY_ID=b.IPAY_ID AND
         a.ipay_detail_id=b.ipay_detail_id AND a.rdp_id=b.rdp_id
END
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 11:13
Цитата Сообщение от xxbesoxx Посмотреть сообщение
могу сообщить ("оператору"-имею в виду кто работает из графический приложений ) что уже есть такой "Вася" в таблице
это ж как так?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
09.09.2015, 13:04
Цитата Сообщение от pincet Посмотреть сообщение
думаю, отсутствие доступа к исходникам клиента
Триггер сделать можно, а констрейнт нельзя? Это странно.

Alexandr-23, в триггер из вашего скрипта просится MERGE.
IF там ни к селу ни к городу
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 13:07
Цитата Сообщение от iap Посмотреть сообщение
Триггер сделать можно
ТС боится словить на клиенте необработанное исключение. Хотя диплом экстрасенса я скурил во втором классе. Могу ошибаться
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
09.09.2015, 13:36
Цитата Сообщение от pincet Посмотреть сообщение
это ж как так?
Можно использовать на разный целю ... На пример оформляется в ломбарде "Договор кредита" клиент выдаёт какой то "техника" (мобильный телефон, планшет , холодильник и.т.д ) БД многопользовательский. работает " несколько Оператор - красивая блондинка " заказчик владелец этого ломбарда работает так .! Если какой то клиент-Вася ( Сунул какой то барахло или не оплатил % во время ) он хочет это клиент перекинуть ( Черный список )= типа он кидала . Для этого создаю таблицу "ChorniSpisok" А для оформление кредитов таблица "Lpriem" а потом делаю проверка с помощью триггеров
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TRIGGER T3_PRIEM_COUNT
ON Lpriem
with encryption -- Зашита скриваю код триггеров
AFTER INSERT
AS
BEGIN
-- Проверяем по  ( № паспорта )
IF (SELECT COUNT (*) FROM ChorniSpisok Ch inner join inserted I ON CH.ch_pasport_n=I.Lpri_PasportNimb)>0
BEGIN
ROLLBACK TRANSACTION
 RAISERROR(N'Это пассажир есть черный списоке ! посылаем на фиг ;)  !!! ', 16, 1)
END
-----------Проверяем: (IMEI или SN техники )
IF (SELECT COUNT (*) FROM ChorniSpisok Ch inner join inserted I ON CH.ch_imei=I.Lpri_imei)>0
BEGIN
 RAISERROR(N' Это БАРАХЛО есть черный списоке ! посылаем на фиг ;) !!! ', 16, 1)
ROLLBACK TRAN
END 
END
Что не так ?
0
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 13
09.09.2015, 13:50  [ТС]
iap, Триггер сделать можно, а констрейнт нельзя? Это странно.

Alexandr-23, в триггер из вашего скрипта просится MERGE.
IF там ни к селу ни к городу
Чем отличается IF от MERGE? Чем второй лучше?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 13:51
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Что не так ?
уважаемый чувствует разницу между PRINT и RAISERROR ?
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
09.09.2015, 13:56
Цитата Сообщение от pincet Посмотреть сообщение
уважаемый чувствует разницу между PRINT и RAISERROR ?
Я не чувствую не. захотел и написал RAISERROR если захочу напишу PRINT
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
09.09.2015, 14:58
Цитата Сообщение от xxbesoxx Посмотреть сообщение
если захочу напишу PRINT
напиши. и почувствуй разницу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2015, 14:58
Помогаю со студенческими работами здесь

Добавление данных через SQL запрос - отменить проверку длины
Добрый день, Подскажите пожалуйста как при добавлении данных в базу (Access), через ADOQuery (INSERT INTO), запретить проверку размера...

Стиль в коде. Тригер, как сделать так, чтобы тригер менял кисть на ту, которая в свойстве контрола
Есть код, работает, но мне нужно, чтобыменялся цвет не на жёстко прописанный Red, а на RectBorderBrush. Как? using System.Windows; ...

Добавление записи через форму
Помогите разобраться пожалуйста. Если у меня есть таблицы: Клиенты(Код клиента, ФИО, адрес), Товары(Код товара, Название товара) и таблица...

Добавление записи через форму
Здравствуйте. На форме есть кнопка и несколько полей, можно ли сделать так чтобы при нажатии на кнопку данные из этих полей записывались в...

Добавление записи через adoquery
Привет я новичек в разработки приложении по запросам в adoquery, можно сказать только начинаю до этого работал в adotable, как пересел на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru