Научно-образовательный IT-форум

Объявление

На форуме имеется приватный контент. Условия получения доступа к нему см. по ссылке

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Триггеры и процедуры в Microsoft SQL Server


[+] Триггеры и процедуры в Microsoft SQL Server

Сообщений 1 страница 10 из 22

1

Здравствуйте! Помогите, пожалуйста, с заданием. Я создал базу данных, мне нужно написать триггер, который при добавлении поставки будет проверять наличие указанного поставщика и товара в таблицах. При добавлении поставки автоматически должно увеличиваться количество товаров на складе для товаров, указанных в поставке на поставляемое количество.

https://bitbucket.org/landwatersun/forum/downloads/201907031.png
https://bitbucket.org/landwatersun/forum/downloads/201907032.png
https://bitbucket.org/landwatersun/forum/downloads/201907033.png
https://bitbucket.org/landwatersun/forum/downloads/201907034.png
https://bitbucket.org/landwatersun/forum/downloads/201907035.png
https://bitbucket.org/landwatersun/forum/downloads/201907036.png

2

Не вправе полностью решить задачу за вас, но это может помочь https://metanit.com/sql/sqlserver/12.2.php.

Для полного понимания, какой SQL запрос у вас обновляет значение поставки? Как он выглядит?

3

Запрос на обновление значения поставки я ещё не составил. Просто у меня ID поставщика находится в таблице Поставки, а ID товара находится в таблице Сведения о поставках.

4

Можете предоставить SQL-скрипт для создания Вашей БД? Или хотя бы скрипт для создания таблиц необходимых?

5

CREATE TABLE [dbo].[_07_Счёта](
[Номер счёта] [int] NOT NULL,
[ID контрагента] [int] NOT NULL,
[ID предмета счёта] [int] NOT NULL,
[Сумма] [smallmoney] NOT NULL,
[Дата] [smalldatetime] NOT NULL,
CONSTRAINT [PK__07_Счёта] PRIMARY KEY CLUSTERED
(
[Номер счёта] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[_07_Счёта]  WITH CHECK ADD  CONSTRAINT [FK__07_Счёта__07_Контрагенты] FOREIGN KEY([ID контрагента])
REFERENCES [dbo].[_07_Контрагенты] ([ID контрагента])
GO

ALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Контрагенты]
GO

ALTER TABLE [dbo].[_07_Счёта]  WITH CHECK ADD  CONSTRAINT [FK__07_Счёта__07_Предметы_счёта] FOREIGN KEY([ID предмета счёта])
REFERENCES [dbo].[_07_Предметы_счёта] ([ID предмета счёта])
GO

ALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Предметы_счёта]
GO

CREATE TABLE [dbo].[_07_Предметы_счёта](
[ID предмета счёта] [int] NOT NULL,
[Товар] [text] NOT NULL,
[Количество] [int] NOT NULL,
[Цена] [smallmoney] NOT NULL,
CONSTRAINT [PK__07_Контрагенты] PRIMARY KEY CLUSTERED
(
[ID предмета счёта] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[_07_Контрагенты](
[ID контрагента] [int] NOT NULL,
[Контрагент] [text] NOT NULL,
[Телефон] [text] NOT NULL,
[Бонусные очки] [int] NOT NULL,
CONSTRAINT [PK__07_Контрагенты_2] PRIMARY KEY CLUSTERED
(
[ID контрагента] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

6

DGash написал(а):

CREATE TABLE [dbo].[_07_Счёта](
[Номер счёта] [int] NOT NULL,
[ID контрагента] [int] NOT NULL,
[ID предмета счёта] [int] NOT NULL,
[Сумма] [smallmoney] NOT NULL,
[Дата] [smalldatetime] NOT NULL,
CONSTRAINT [PK__07_Счёта] PRIMARY KEY CLUSTERED
(
[Номер счёта] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[_07_Счёта]  WITH CHECK ADD  CONSTRAINT [FK__07_Счёта__07_Контрагенты] FOREIGN KEY([ID контрагента])
REFERENCES [dbo].[_07_Контрагенты] ([ID контрагента])
GO

ALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Контрагенты]
GO

ALTER TABLE [dbo].[_07_Счёта]  WITH CHECK ADD  CONSTRAINT [FK__07_Счёта__07_Предметы_счёта] FOREIGN KEY([ID предмета счёта])
REFERENCES [dbo].[_07_Предметы_счёта] ([ID предмета счёта])
GO

ALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Предметы_счёта]
GO

CREATE TABLE [dbo].[_07_Предметы_счёта](
[ID предмета счёта] [int] NOT NULL,
[Товар] [text] NOT NULL,
[Количество] [int] NOT NULL,
[Цена] [smallmoney] NOT NULL,
CONSTRAINT [PK__07_Контрагенты] PRIMARY KEY CLUSTERED
(
[ID предмета счёта] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[_07_Контрагенты](
[ID контрагента] [int] NOT NULL,
[Контрагент] [text] NOT NULL,
[Телефон] [text] NOT NULL,
[Бонусные очки] [int] NOT NULL,
CONSTRAINT [PK__07_Контрагенты_2] PRIMARY KEY CLUSTERED
(
[ID контрагента] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


Неполный перечень всех таблиц?

7

Обязательно нужен триггер?
Обычно в таких случаях используют внешние ключи, которые автоматически накладывают ограничения на столбцы. Необходимо провести нормализацию БД и все таблицы связать между собой с помощью внешних ключей.

Что же касается таблицы [Складские запасы], то, на мой взгляд, необходимости в ней нет, поскольку количество товаров можно всегда подсчитать с помощью запроса к таблице [Сведения о поставках]. Текст запроса:
SELECT
  [ID товара],
  COUNT(*) AS Количество
FROM
  [Сведения о поставках]
GROUP BY
  [ID товара]
Можно создать представление (VIEW), которое будет использовать данный запрос.

8

Ой, извините, это не те таблицы
Вот нужные:

CREATE TABLE [dbo].[Поставки](
[ID поставки] [int] NOT NULL,
[ID поставщика] [int] NOT NULL,
[Дата] [smalldatetime] NULL,
CONSTRAINT [PK_Поставки] PRIMARY KEY CLUSTERED
(
[ID поставки] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Поставки]  WITH CHECK ADD  CONSTRAINT [FK_Поставки_Поставщики] FOREIGN KEY([ID поставщика])
REFERENCES [dbo].[Поставщики] ([ID поставщика])
GO

ALTER TABLE [dbo].[Поставки] CHECK CONSTRAINT [FK_Поставки_Поставщики]
GO

CREATE TABLE [dbo].[Поставщики](
[ID поставщика] [int] NOT NULL,
[Название] [nvarchar](50) NOT NULL,
[Адрес] [nvarchar](50) NULL,
[Телефон] [nvarchar](50) NULL,
CONSTRAINT [PK_Поставщики] PRIMARY KEY CLUSTERED
(
[ID поставщика] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Сведения о поставках](
[ID поставки] [int] NOT NULL,
[Номер позиции] [int] NOT NULL,
[ID товара] [int] NOT NULL,
[Цена] [money] NOT NULL,
[Количество] [int] NOT NULL,
[Стоимость]  AS ([Цена]*[Количество]),
CONSTRAINT [PK_Сведения о поставках] PRIMARY KEY CLUSTERED
(
[ID поставки] ASC,
[Номер позиции] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Сведения о поставках]  WITH CHECK ADD  CONSTRAINT [FK_Сведения о поставках_Поставки] FOREIGN KEY([ID поставки])
REFERENCES [dbo].[Поставки] ([ID поставки])
GO

ALTER TABLE [dbo].[Сведения о поставках] CHECK CONSTRAINT [FK_Сведения о поставках_Поставки]
GO

ALTER TABLE [dbo].[Сведения о поставках]  WITH CHECK ADD  CONSTRAINT [FK_Сведения о поставках_Товары] FOREIGN KEY([ID товара])
REFERENCES [dbo].[Товары] ([ID Товара])
GO

ALTER TABLE [dbo].[Сведения о поставках]

CREATE TABLE [dbo].[Складские запасы](
[ID товара] [int] NOT NULL,
[Количество] [int] NOT NULL,
CONSTRAINT [PK_Складские запасы] PRIMARY KEY CLUSTERED
(
[ID товара] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Складские запасы] ADD  CONSTRAINT [DF_Складские запасы_Количество]  DEFAULT ((0)) FOR [Количество]
GO

ALTER TABLE [dbo].[Складские запасы]  WITH CHECK ADD  CONSTRAINT [FK_Складские запасы_Товары] FOREIGN KEY([ID товара])
REFERENCES [dbo].[Товары] ([ID Товара])
GO

ALTER TABLE [dbo].[Складские запасы] CHECK CONSTRAINT [FK_Складские запасы_Товары]
GO

CREATE TABLE [dbo].[Товары](
[ID Товара] [int] NOT NULL,
[Название] [nvarchar](50) NULL,
CONSTRAINT [PK_Товары] PRIMARY KEY CLUSTERED
(
[ID Товара] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

9

alex_spq написал(а):

Обязательно нужен триггер?
Обычно в таких случаях используют внешние ключи, которые автоматически накладывают ограничения на столбцы. Необходимо провести нормализацию БД и все таблицы связать между собой с помощью внешних ключей.

Что же касается таблицы [Складские запасы], то, на мой взгляд, необходимости в ней нет, поскольку количество товаров можно всегда подсчитать с помощью запроса к таблице [Сведения о поставках]. Текст запроса:
SELECT
  [ID товара],
  COUNT(*) AS Количество
FROM
  [Сведения о поставках]
GROUP BY
  [ID товара]
Можно создать представление (VIEW), которое будет использовать данный запрос.


Нужен триггер
https://bitbucket.org/landwatersun/forum/downloads/201907037.png

10

Это дисциплина "Базы данных"? Если выполнять данное задание "до буквы", то нужно еще и процедуру написать. Я так понимаю, она уже есть у Вас?

Отредактировано alex_spq (2019-06-30 10:54:11)


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Триггеры и процедуры в Microsoft SQL Server