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

Тригер

27.05.2013, 15:21. Показов 2474. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
БД «Мировые рыбные ресурсы»
Тригер: розробити тригер на додання/зміну записів у таблиці «Рыбы», такий, щоб забороняти додавання запису, значення усіх полів якого співпадають зі значеннями вже існуючого запису в цій таблиці (окрім коду риби).
Збережена процедура: за даним типом середи життя показати кількості сімейств риб, пристосованих до такого типу середи.

Как написать так, что бы строка "'Данные об этой рыбе уже есть в таблице!!!'", выводилась при добавлени записи, которая уже существует???


SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TRIGGER prohibits_adding
ON [dbo].[рыбы] FOR INSERT
AS
IF @@ROWCOUNT=1
BEGIN
IF NOT EXISTS(SELECT *
FROM inserted
WHERE -inserted.код_рыбы =ALL(SELECT
рыбы.код_рыбы
FROM рыбы
WHERE рыбы.код_рыбы = рыбы.код_рыбы))
BEGIN
ROLLBACK TRAN
PRINT 
'Данные об этой рыбе уже есть в таблице!!!'
END
END
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2013, 15:21
Ответы с готовыми решениями:

Тригер на изменение таблицы
Товарищи, такая ситуация есть таблица t1 с столбцами p1 и p2. Столбец p1 сразу заполняется, а p2...

Тригер на изменение таблицы
USE GO /****** Object: Trigger . Script Date: 07.03.2016 21:09:34 ******/ SET ANSI_NULLS ON...

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

Подскажите как реализовать тригер
Добрый вечер. Есть вот такая БД. Задали написать триггер, реализующий вычисления в БД. Немного не...

14
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
27.05.2013, 15:34 2
А две одинаковых рыбы добавить-таки можно, да?

Добавлено через 1 минуту
@@ROWCOUNT в триггерах я в последнее время не использую.
Вдруг захочется выполнить MERGE для этой таблицы?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.05.2013, 16:05 3
хм... заинтересовался)
AFTER INSERT отрабатывает уже после добавления в таблицу, поэтому просто проверки совпадения INSERTED и [Таблица] недостаточно - данные уже добавлены
Вариант для критики: ))
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
29
30
31
32
33
34
35
if object_id('ryba','U') is not null drop table ryba
create table ryba (id int identity, name nvarchar(100))
GO
if object_id('tr_ryba','TR') is not null drop trigger tr_ryba 
GO
create trigger tr_ryba on ryba 
after insert,update as
if exists(
   select NULL
   from inserted i
   join ryba r on r.name=i.name
   group by i.name
   having COUNT(*)>1
   ) 
begin
   rollback tran
   print '********** already exists *********'
end   
GO
 
insert ryba values ('пескарь'),('карась') 
select * from ryba
GO
 
insert ryba values ('щука'),('пескарь') 
select * from ryba
GO
 
update ryba set name='плотва' where name='карась'
select * from ryba
GO
 
update ryba set name='плотва' 
select * from ryba
GO
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
27.05.2013, 16:23 4
Цитата Сообщение от cygapb-007 Посмотреть сообщение
хм... заинтересовался)
AFTER INSERT отрабатывает уже после добавления в таблицу, поэтому просто проверки совпадения INSERTED и [Таблица] недостаточно - данные уже добавлены
Вариант для критики: ))
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
29
30
31
32
33
34
35
if object_id('ryba','U') is not null drop table ryba
create table ryba (id int identity, name nvarchar(100))
GO
if object_id('tr_ryba','TR') is not null drop trigger tr_ryba 
GO
create trigger tr_ryba on ryba 
after insert,update as
if exists(
   select NULL
   from inserted i
   join ryba r on r.name=i.name
   group by i.name
   having COUNT(*)>1
   ) 
begin
   rollback tran
   print '********** already exists *********'
end   
GO
 
insert ryba values ('пескарь'),('карась') 
select * from ryba
GO
 
insert ryba values ('щука'),('пескарь') 
select * from ryba
GO
 
update ryba set name='плотва' where name='карась'
select * from ryba
GO
 
update ryba set name='плотва' 
select * from ryba
GO
Возможно, ROLLBACK в триггере не очень хорошо.
Вместо ROLLBACK и PRINT лучше, наверно, RAISERROR().
1
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
27.05.2013, 16:39 5
Цитата Сообщение от iap Посмотреть сообщение
Возможно, ROLLBACK в триггере не очень хорошо.
А почему?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
27.05.2013, 16:47 6
Цитата Сообщение от pincet Посмотреть сообщение
А почему?
А зачем нужно сообщение
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
?
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
27.05.2013, 16:57 7
вот тут http://msdn.microsoft.com/ru-r... 05%29.aspx
как-то ни слова про ROLLBACK
Или читал не до полного просветления?
AFAIR триггер всегда в транзакции исполняется. Или опять нет полного просветления?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
27.05.2013, 17:01 8
Цитата Сообщение от pincet Посмотреть сообщение
вот тут http://msdn.microsoft.com/ru-r... 05%29.aspx
как-то ни слова про ROLLBACK
Или читал не до полного просветления?
AFAIR триггер всегда в транзакции исполняется. Или опять нет полного просветления?
Я вроде нигде и не говорил, что нельзя.
RAISERROR() лучше, это моё мнение. Не больше.
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
27.05.2013, 17:06 9
я правильно понял - RAISERROR в триггере откатит транзакцию?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.05.2013, 17:14 10
меня в общем-то не столько ROLLBACK интересовал, сколько группировка... как-то тяжеловесно получается, вроде...
Хотя с другой стороны, как иначе - пока не вижу)

Добавлено через 4 минуты
Цитата Сообщение от pincet Посмотреть сообщение
я правильно понял - RAISERROR в триггере откатит транзакцию?
RAISERROR сгенерирует собственную ошибку вместо стандартной, которую можно будет перехватить в приложении (PRINT из приложения не виден), ошибка в свою очередь приведет к откату транзакции
1
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
27.05.2013, 17:14 11
Цитата Сообщение от pincet Посмотреть сообщение
я правильно понял - RAISERROR в триггере откатит транзакцию?
Триггер запускается при XACT_ABORT ON
Поэтому всё откатится.
1
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
27.05.2013, 17:18 12
доставляет вот что.
Цитата Сообщение от Lexa777 Посмотреть сообщение
значення усіх полів якого співпадають зі значеннями вже існуючого запису в цій таблиці (окрім коду риби).
Если у некой рыбы 100500 признаков, и каждое - поле в таблице - чего делать-то?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.05.2013, 17:27 13
Цитата Сообщение от pincet Посмотреть сообщение
доставляет вот что.
Сообщение от Lexa777
значення усіх полів якого співпадають зі значеннями вже існуючого запису в цій таблиці (окрім коду риби).

Если у некой рыбы 100500 признаков, и каждое - поле в таблице - чего делать-то?
Более четко сформулировать постановку задачи)) А из четкой постановки сразу будет видно и правильное решение)
0
pincet
27.05.2013, 17:30
  #14

Не по теме:


так куда уже чётче-то? Совпадение ВСЕХ полей, кроме id

0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.05.2013, 17:40 15
Цитата Сообщение от pincet Посмотреть сообщение

Не по теме:


так куда уже чётче-то? Совпадение ВСЕХ полей, кроме id

Ну тогда просто перечислять все поля по AND в JOIN
0
27.05.2013, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2013, 17:40
Помогаю со студенческими работами здесь

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

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

Тригер на Update всей таблицы и запись стараых данных в таблицу History
Тело тригера: CREATE TRIGGER ON .. FOR update AS BEGIN DECLARE @id int; DECLARE @new_str...

Тригер для удаления в варианте FOR EACH ROW для SQL 2000
Всем привет! Вот уперся, ни куда! Нужно удалить 5 строк и dbo1 и точно такие же 5 строк из dbo2...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru