Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Написание триггера  [new]
Rendll
Member

Откуда:
Сообщений: 4
Всем превед! У меня есть маленький проект на DELPHI + MS SQL(использовал ADO). Есть таблица самолет с полями(Борт_номер,Модель,Авиакомпания,Дата_выпуска ,Всего_мест,Первый_класс,Бизнес_класс,Эконом_класс ) и таблица Билеты. Проблема такого рода. Нада написать триггер который бы запрещал добавление записи в таблицу Билеты, если количество превышает общее количество билетов определённого класса. Тут нужно заметить, что у каждой модели самолета, разное кол.мест, это нада учесть. Даже не знаю как это реализовать. С помощью таблиц представлений + триггеры?

Может кто-нибудь подскажет как это сделать??
3 дек 09, 01:59    [8011520]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
aleks2
Guest
Rendll
Всем превед! У меня есть маленький проект на DELPHI + MS SQL(использовал ADO). Есть таблица самолет с полями(Борт_номер,Модель,Авиакомпания,Дата_выпуска ,Всего_мест,Первый_класс,Бизнес_класс,Эконом_класс ) и таблица Билеты. Проблема такого рода. Нада написать триггер который бы запрещал добавление записи в таблицу Билеты, если количество превышает общее количество билетов определённого класса. Тут нужно заметить, что у каждой модели самолета, разное кол.мест, это нада учесть. Даже не знаю как это реализовать. С помощью таблиц представлений + триггеры?

Может кто-нибудь подскажет как это сделать??


1. Вопче-то, у билета есть НОМЕР МЕСТА. Поэтому первый вариант - FOREIGN KEY (Борт_номер, Номер_места)+unique index(Борт_номер, Номер_места).

2. Вариант 2. Constraint на таблицу Билеты со скалярной функцией тупо считающей уже записанные билеты и сравнивающей с общим числом мест.

3. А как вы будете ЛИШНИЕ билетики продавать? Это ж, вроде, общая практика авиакомпаний....

PS. Ну триггер тоже можно... только не нужно.
3 дек 09, 07:26    [8011702]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
aleks2
3. А как вы будете ЛИШНИЕ билетики продавать? Это ж, вроде, общая практика авиакомпаний....
А стоячие места? С ними как поступим?

Rendll,
что-то не видно CREATE TABLE от Вас. + INSERT + SELECT @@VERSION + Ваш хотя бы черновой вариант запроса.
3 дек 09, 09:09    [8011838]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
Rendll
Member

Откуда:
Сообщений: 4
Смотрите ниже, какие столбцы есть в этих таблицах! Ети 2 таблици между собой не связаны. А может можна сравнить общее кол. билетов с кол.записей в таблице билеты, и написать триггер, который бы запрещал добавлять данные в таблицу "билеты", если кол.записей > общего кол.?? И ещё госпожа 1 вопрос: как сделать проверку, чтоб общее кол билетов 3классов(Бизнес,Эконом,Первый) не превышало общее кол билетов. Чтоб не получилося, что ввели Общее кол. 300, Бизнес - 60, Эконом 150, и ещё и Первый - 200.

К сообщению приложен файл. Размер - 0Kb
3 дек 09, 19:18    [8016572]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
iljy
Member

Откуда:
Сообщений: 8711
Rendll
Смотрите ниже, какие столбцы есть в этих таблицах! Ети 2 таблици между собой не связаны. А может можна сравнить общее кол. билетов с кол.записей в таблице билеты, и написать триггер, который бы запрещал добавлять данные в таблицу "билеты", если кол.записей > общего кол.?? И ещё госпожа 1 вопрос: как сделать проверку, чтоб общее кол билетов 3классов(Бизнес,Эконом,Первый) не превышало общее кол билетов. Чтоб не получилося, что ввели Общее кол. 300, Бизнес - 60, Эконом 150, и ещё и Первый - 200.

Триггер - можно, пишите. Но лучше CONSTRAINT с функцией подсчета. А про общее количество - повесьте еще один CONSTRAINT.
3 дек 09, 19:38    [8016612]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
Rendll
Member

Откуда:
Сообщений: 4
а кто знает как подсчитать кол.записей в таблице??
4 дек 09, 01:30    [8017312]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
Rendll
Member

Откуда:
Сообщений: 4
Если можна, покажите пример использования Constraint, тоесть втророй вариант, а то я пока новичек совсем :))
2. Вариант 2. Constraint на таблицу Билеты со скалярной функцией тупо считающей уже записанные билеты и сравнивающей с общим числом мест.
4 дек 09, 01:46    [8017325]     Ответить | Цитировать Сообщить модератору
 Re: Написание триггера  [new]
aleks2
Guest
CREATE FUNCTION dbo.ПроверитьЧислоБилетов	(@Рейс char(50), @Класс int)
RETURNS bit
AS
BEGIN
if @Класс=1 begin
   if (select МестПервогоКласса FROM dbo.Рейсы r INNER JOIN dbo.Самолеты s ON r.БортНомер=s.БортНомер WHERE r.Рейс=@Рейс)
      >=
     (select COUNT(*) FROM dbo.Билеты b WHERE b.Рейс=@Рейс AND b.Класс=@Класс)
   return 1
--end else if @Класс=2 begin
--end else if @Класс=3 begin
end 
RETURN 0
END
go
CREATE TABLE [Билеты] (
	[Билет] [int] IDENTITY (1, 1) NOT NULL ,
	[Рейс] [char] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
	[Класс] [int] NOT NULL ,
	CONSTRAINT [PK_Билеты] PRIMARY KEY  CLUSTERED 
	(
		[Билет]
	)  ON [PRIMARY] ,
	CONSTRAINT [CK_Билеты] CHECK ([dbo].[ПроверитьЧислоБилетов]([Рейс], [Класс]) = convert(bit,1))
) ON [PRIMARY]
GOCREATE TABLE [Рейсы] (
	[Рейс] [char] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
	[БортНомер] [char] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
	CONSTRAINT [PK_Рейсы] PRIMARY KEY  CLUSTERED 
	(
		[Рейс],
		[БортНомер]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO
CREATE TABLE [Самолеты] (
	[БортНомер] [char] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
	[МестПервогоКласса] [int] NOT NULL ,
	CONSTRAINT [PK_Самолет] PRIMARY KEY  CLUSTERED 
	(
		[БортНомер]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO
4 дек 09, 08:57    [8017694]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить