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

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

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

Author24 — интернет-сервис помощи студентам
Привет всем, дано две таблички 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2014, 14:54
Ответы с готовыми решениями:

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

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

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

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

2
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
16.02.2014, 15:13 2
Надо просто учесть, что триггер AFTER INSERT вызывается, когда все строки в саму таблицу УЖЕ ВСТАВЛЕНЫ!
Значит, проверять надо просто количество записей в таблице без всякого inserted.
Триггер INSTEAD OF INSERT вызывается ВМЕСТО ВСТАВКИ. Значит, вставку надо написать в явном виде внутри этого триггера.
А перед этим проверить, устраивает ли количество записей в таблице плюс количество записей в inserted.
И если не устраивает, просто не вставлять.
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
16.02.2014, 18:18 3
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
16.02.2014, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2014, 18:18
Помогаю со студенческими работами здесь

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

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

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

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


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

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