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

Откуда:
Сообщений: 10
Здравствуйте!
Очень хотелось бы узнать, как можно организовать удаление записей из дочерней таблицы, при этом необходимо обновлять одно поле в parent table.
Триггер ведь выполняется только один раз...
т.е. хотелось бы узнать, каким образом организовывается обновление каждой строки в таблице родительской. Сам триггер установлен на дочернюю таблицу.
SQL Server 2000.

Заранее спасибо!
22 ноя 05, 15:26    [2095333]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер на удаление (работа с множеством записей)?  [new]
Berg
Member

Откуда: Кр-ск
Сообщений: 3480
1) Во-первых почитайте про каскадное обновление. После этого триггеры могут не понадобиться;
2) Триггер выполняется один раз, но зато для всех записей сразу, так что проблем нет.
22 ноя 05, 15:31    [2095382]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер на удаление (работа с множеством записей)?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

про таблицы inserted, deleted Вы слышали?


Posted via ActualForum NNTP Server 1.3

22 ноя 05, 15:32    [2095397]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер на удаление (работа с множеством записей)?  [new]
KonakOFF
Member

Откуда:
Сообщений: 10
Я еще только учусь, поэтому не поймите привратно.
Дело в том, что это задание такое - написать такой триггер. Разумеется, курсор объявлять для таких целей - затормозится система.
Дело в том, что я уже много чего перепробовал. Не получается написать запрос, для удаления множества записей.
вот таблицы:
CREATE TABLE [Отдел] (
[Отдел_номер] [int] NOT NULL ,
[Название] [char] (20) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[Отдел_зарп] [money] NOT NULL ,
[Отдел_кол] [int] NOT NULL ,
CONSTRAINT [PK_Отдел] PRIMARY KEY CLUSTERED
(
[Отдел_номер]
) ON [PRIMARY]
) ON [PRIMARY]
GO

Вторая таблица:
CREATE TABLE [Сотрудник] (
[Номер] [int] NOT NULL ,
[Имя] [char] (15) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[Начальник] [int] NOT NULL ,
[Отдел] [int] NOT NULL ,
[Оклад] [money] NOT NULL ,
CONSTRAINT [PK_Сотрудник] PRIMARY KEY CLUSTERED
(
[Номер]
) ON [PRIMARY] ,
CONSTRAINT [FK_Сотрудник_Отдел] FOREIGN KEY
(
[Отдел]
) REFERENCES [Отдел] (
[Отдел_номер]
),
CONSTRAINT [FK_Сотрудник_Сотрудник] FOREIGN KEY
(
[Начальник]
) REFERENCES [Сотрудник] (
[Номер]
)
) ON [PRIMARY]
GO

Триггер должен обновлять количество сотрудников и суммарную зарплату отдела.
Как организовать такой запрос...
что у меня неправильно?
CREATE TRIGGER DEL_emp ON dbo.Сотрудник
FOR DELETE
AS
DECLARE @row int
select @row = count(*) from Deleted
While @row!=0
Begin
Update отдел
SET отдел_кол = отдел_кол - 1,
отдел_зарп = отдел_зарп -( select оклад from deleted )
where отдел_номер= (Select отдел from deleted)
set @row = @row -1
End
22 ноя 05, 15:41    [2095493]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер на удаление (работа с множеством записей)?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31622
KonakOFF
Триггер должен обновлять количество сотрудников и суммарную зарплату отдела.
Как организовать такой запрос...
что у меня неправильно?
CREATE TRIGGER DEL_emp ON dbo.Сотрудник 
FOR DELETE 
AS
DECLARE @row int
 select @row = count(*) from Deleted
While @row!=0
Begin 
Update отдел
SET отдел_кол = отдел_кол - 1,
отдел_зарп = отдел_зарп -( select оклад from deleted )
where отдел_номер= (Select отдел from deleted)
set @row = @row -1 
End


CREATE TRIGGER DEL_emp ON dbo.Сотрудник 
FOR DELETE 
AS
Update o
SET отдел_кол = отдел_кол - c.cnt,
    отдел_зарп = отдел_зарп - c.окл
from отдел as o
join (
        select d.отдел, count(*) as cnt, sum(d.оклад) as окл 
        from deleted d
        group by d.отдел
    ) as c on c.отдел = o.отдел_номер
End
22 ноя 05, 15:51    [2095577]     Ответить | Цитировать Сообщить модератору
 Re: Как создать триггер на удаление (работа с множеством записей)?  [new]
Glory
Member

Откуда:
Сообщений: 104760
CREATE TRIGGER DEL_emp ON dbo.Сотрудник 
FOR INSERT, UPDATE, DELETE 
AS
begin
if @@rowcount = 0 return
    
set nocount on
Update a
SET отдел_кол = отдел_кол - 1,
отдел_зарп = отдел_зарп
from отдел a
inner join (select отдел_номер, sum(cnt) as cnt, sum(оклад) as оклад
from( 
select 1 as cnt, оклад from inserted
union all
select -1 as cnt, -оклад from deleted 
) as x
group by отдел_номер) as b
on a.отдел_номер = b.отдел_номер
End
22 ноя 05, 15:53    [2095587]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить