SmithZz
@SmithZz
Обычный студент...

Как создать триггер?

Как создать триггер, который считает кол-во студентов по регионам и записывает это в другую таблицу? Я создал представление, которое показывает, какой примерно вывод мы получим в той таблице:

SELECT        dbo.Regions.Region, COUNT(dbo.Students.ID) AS Expr1
FROM            dbo.Students INNER JOIN
                         dbo.Regions ON dbo.Students.Region = dbo.Regions.ID
GROUP BY dbo.Regions.Region, dbo.Students.Region

Вывод:

  • Белгородская область 3
  • Тверская область 2

Триггер должен работать на основе таблицы Students.
Таблицы
CREATE TABLE [dbo].[Students](
    [ID] [int] NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [DateBorn] [date] NOT NULL,
    [Region] [int] NOT NULL,
    [Nationality] [int] NOT NULL,
    [Group] [int] NOT NULL,
 CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Students]  WITH CHECK ADD  CONSTRAINT [FK_Students_Groups] FOREIGN KEY([Group])
REFERENCES [dbo].[Groups] ([ID])
GO

ALTER TABLE [dbo].[Students] CHECK CONSTRAINT [FK_Students_Groups]
GO

ALTER TABLE [dbo].[Students]  WITH CHECK ADD  CONSTRAINT [FK_Students_Nationalities] FOREIGN KEY([Nationality])
REFERENCES [dbo].[Nationalities] ([ID])
GO

ALTER TABLE [dbo].[Students] CHECK CONSTRAINT [FK_Students_Nationalities]
GO

ALTER TABLE [dbo].[Students]  WITH CHECK ADD  CONSTRAINT [FK_Students_Regions] FOREIGN KEY([Region])
REFERENCES [dbo].[Regions] ([ID])
GO

ALTER TABLE [dbo].[Students] CHECK CONSTRAINT [FK_Students_Regions]
GO

Листинг таблицы Regions:
CREATE TABLE [dbo].[Regions](
    [ID] [int] NOT NULL,
    [Region] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Regions] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Триггер не работает в пустоту, то есть, например, в таблицеRegions должно быть поле StudentCount. Но это неправильно.
Создайте представление по регионам с подсчетом количества студентов.

Добавил поле для сохранения количества студентов:
ALTER TABLE dbo.Regions ADD StudentCount int NULL
Для сохранения актуальности нужно делать триггер на все действия:
CREATE OR ALTER TRIGGER StudentRegionCulc ON Students AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
  UPDATE Regions
    SET StudentCount = 
      ( SELECT COUNT(*) 
          FROM Students WHERE Students.Region = inserted.Region )     
    FROM inserted 
      INNER JOIN Regions ON inserted.Region = Regions.ID

  UPDATE Regions
    SET StudentCount = 
      ( SELECT COUNT(*) 
          FROM Students WHERE Students.Region = deleted.Region )     
    FROM deleted 
      INNER JOIN Regions ON deleted.Region = Regions.ID
END
GO
Результат:
SELECT ID, Region, StudentCount,
      ( SELECT COUNT(*)          
          FROM Students 
          WHERE Students.Region = Regions.ID ) AS StudentCountCheck
  FROM Regions
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы