20 / 20 / 1
Регистрация: 03.01.2013
Сообщений: 184

Как победить триггер

16.02.2014, 14:54. Показов 725. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем, дано две таблички Chidren и Class, в табл. Children есть поле ClassID, т.е. определяется в каком классе учиться ребёнок. Как написать триггер-инсерт, который ограничивал бы число обучающихся в классе до 30, т.е. если в момент вставки в Children указывается ClassID=1 и в этом классе больше 30 чел., то отменить вставку.

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ALTER TRIGGER triggerForChildren ON [dbo].[Childer] --Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF ((SELECT 
        COUNT(*) 
    FROM [dbo].[Childer] c 
    JOIN inserted AS i ON c.id = i.id 
        JOIN [dbo].[Class] AS cl ON cl.id = c.ClassID
    WHERE cl.Class != 0 and cl.id = i.ClassID
    ) > 30)
BEGIN
    RAISERROR ('Превышено допустимое количество учеников в классе.', 16, 1);
    PRINT ('4o proishodit');
    ROLLBACK TRANSACTION;
    RETURN
END;
вот что я накидал, если использовать After insert, то все строки вставляются.
если использовать instead of insert, то ни чего не вставляется.

Табл. Children заполняю циклом

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare @i int = 1, @max int = (SELECT COUNT(Class) FROM Class where Class != 0), @name varchar(30), @last varchar(30), @classID int, @bd date 
declare @n tinyint = 1, @t int
while @i <= 300 --@max
BEGIN
    set @n = 1
    
        set @name = 'Name ' + CAST(@i as varchar)
        set @last = 'LastName ' + CAST(@i as varchar)
        set @t = rand()*datediff(day, '1996-01-01', '2003-01-01')
        set @bd = dateadd(day, @t, '1996-01-01')
        set @classID = (SELECT id FROM Class WHERE CEILING(rand()*(10-1)) = id)
        insert into Childer(Name, LastName, BirthDate, ClassID, [NumberAtClass])
        values(@name, @last, @bd, @classID, @n)
 
    set @i +=1
END
хелп!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2014, 14:54
Ответы с готовыми решениями:

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

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

2
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
16.02.2014, 15:13
Надо просто учесть, что триггер AFTER INSERT вызывается, когда все строки в саму таблицу УЖЕ ВСТАВЛЕНЫ!
Значит, проверять надо просто количество записей в таблице без всякого inserted.
Триггер INSTEAD OF INSERT вызывается ВМЕСТО ВСТАВКИ. Значит, вставку надо написать в явном виде внутри этого триггера.
А перед этим проверить, устраивает ли количество записей в таблице плюс количество записей в inserted.
И если не устраивает, просто не вставлять.
0
3613 / 2134 / 756
Регистрация: 02.06.2013
Сообщений: 5,164
16.02.2014, 18:18
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
alter trigger triggerForChildren on [dbo].[Childer]
after insert
as
begin
 set nocount on;
 
 if not exists(select * from inserted)
  return;
 
 if exists(
   select 
    * 
   from
    [dbo].[Childer] c
   where
    exists(select * from inserted where ClassId = c.ClassID)
   group by
    c.ClassID
   having
    count(*) > 30
  )
  begin
    raiserror ('Превышено допустимое количество учеников в классе.', 16, 1);
    rollback transaction;
    return;
  end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2014, 18:18
Помогаю со студенческими работами здесь

Как выполняется триггер?
Всем доброго времени суток! Очень нужна ваша помощь! Есть таблица (table1) и триггер на эту таблицу (на insert/update). При обновлении...

Как создать триггер ?
Помогите, пожалуйста, создать триггер который будит удалять соответствующие поля в табличках СабФакулти и Груп при удалении какого-то поля...

Ребят, подскажите как сделать триггер?
Необходим триггер для SQL server. Суть вопроса: Есть таблица Workflow с полями PID(int not Null), SID(int not Null),...

Как создать триггер - удалять клиентов, возраст которых больше 100 лет?
для этой таблицы! create table Пациент ( Код_Поциента int not null primary key identity(1,1), ФИО varchar(50)not null, Адрес...

Как создать триггер который обновляет запись в таблицы при добавлении записи в другую таблицу
Всем привет, нужна помощь с триггером, столкнулся с ним в первые до этого использовал процедуры, а диплом горит) История такая: ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru