Здравствуйте! Помогите, пожалуйста, с заданием. Я создал базу данных, мне нужно написать триггер, который при добавлении поставки будет проверять наличие указанного поставщика и товара в таблицах. При добавлении поставки автоматически должно увеличиваться количество товаров на складе для товаров, указанных в поставке на поставляемое количество.
[+] Триггеры и процедуры в Microsoft SQL Server
Сообщений 1 страница 10 из 22
Поделиться22019-06-28 23:38:07
Не вправе полностью решить задачу за вас, но это может помочь https://metanit.com/sql/sqlserver/12.2.php.
Для полного понимания, какой SQL запрос у вас обновляет значение поставки? Как он выглядит?
Поделиться32019-06-29 00:40:43
Запрос на обновление значения поставки я ещё не составил. Просто у меня ID поставщика находится в таблице Поставки, а ID товара находится в таблице Сведения о поставках.
Поделиться42019-06-30 10:13:40
Можете предоставить SQL-скрипт для создания Вашей БД? Или хотя бы скрипт для создания таблиц необходимых?
Поделиться52019-06-30 10:22:26
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
Поделиться62019-06-30 10:33:52
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]
GOALTER TABLE [dbo].[_07_Счёта] WITH CHECK ADD CONSTRAINT [FK__07_Счёта__07_Контрагенты] FOREIGN KEY([ID контрагента])
REFERENCES [dbo].[_07_Контрагенты] ([ID контрагента])
GOALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Контрагенты]
GOALTER TABLE [dbo].[_07_Счёта] WITH CHECK ADD CONSTRAINT [FK__07_Счёта__07_Предметы_счёта] FOREIGN KEY([ID предмета счёта])
REFERENCES [dbo].[_07_Предметы_счёта] ([ID предмета счёта])
GOALTER TABLE [dbo].[_07_Счёта] CHECK CONSTRAINT [FK__07_Счёта__07_Предметы_счёта]
GOCREATE 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]
GOCREATE 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
Неполный перечень всех таблиц?
Поделиться72019-06-30 10:38:18
Обязательно нужен триггер?
Обычно в таких случаях используют внешние ключи, которые автоматически накладывают ограничения на столбцы. Необходимо провести нормализацию БД и все таблицы связать между собой с помощью внешних ключей.
Что же касается таблицы [Складские запасы], то, на мой взгляд, необходимости в ней нет, поскольку количество товаров можно всегда подсчитать с помощью запроса к таблице [Сведения о поставках]. Текст запроса:
SELECT
[ID товара],
COUNT(*) AS Количество
FROM
[Сведения о поставках]
GROUP BY
[ID товара]
Можно создать представление (VIEW), которое будет использовать данный запрос.
Поделиться82019-06-30 10:39:19
Ой, извините, это не те таблицы
Вот нужные:
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
Поделиться92019-06-30 10:45:56
Обязательно нужен триггер?
Обычно в таких случаях используют внешние ключи, которые автоматически накладывают ограничения на столбцы. Необходимо провести нормализацию БД и все таблицы связать между собой с помощью внешних ключей.Что же касается таблицы [Складские запасы], то, на мой взгляд, необходимости в ней нет, поскольку количество товаров можно всегда подсчитать с помощью запроса к таблице [Сведения о поставках]. Текст запроса:
SELECT
[ID товара],
COUNT(*) AS Количество
FROM
[Сведения о поставках]
GROUP BY
[ID товара]
Можно создать представление (VIEW), которое будет использовать данный запрос.
Нужен триггер
Поделиться102019-06-30 10:51:19
Это дисциплина "Базы данных"? Если выполнять данное задание "до буквы", то нужно еще и процедуру написать. Я так понимаю, она уже есть у Вас?
Отредактировано alex_spq (2019-06-30 10:54:11)