Есть таблицы: заказчик, заказ, книга, книги в заявках
CREATE TABLE client --Заказчик
(
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(50) NULL
);
CREATE TABLE request --Заказ
(
id INTEGER NOT NULL IDENTITY PRIMARY KEY,
id_client INTEGER NOT NULL FOREIGN KEY REFERENCES client(id),
create_date DATE NOT NULL DEFAULT GETDATE()
);
CREATE TABLE book_in_request --Издание в заказах
(
id_book INTEGER FOREIGN KEY REFERENCES book(id),
id_request INTEGER FOREIGN KEY REFERENCES request(id),
qty INTEGER NOT NULL CHECK (qty > 0),
PRIMARY KEY (id_book, id_request)
);
CREATE TABLE book --Книга
(
id INTEGER NOT NULL IDENTITY PRIMARY KEY,
title VARCHAR(70) NOT NULL,
public_year DATE NOT NULL,
pgs INTEGER NOT NULL CHECK(pgs > 0)
);
Нужно написать триггер который запретит заказчику заказывать больше 5 заказов в неделю в целом или больше 100 книг в неделю, помогите разобраться, в sql я не очень силен, и триггеры на запрет вставки не писал ни разу) спасибо заранее..
1 ответ 1
Лучше бы все-таки все проверки делать до вставки в базу. Но если уж обязательно делать имеено триггером, то думаю вот этот вариант Вам подойдет
CREATE TRIGGER [имя триггера] AFTER INSERT AS
BEGIN
IF EXISTS([здесь нужно вставить запрос, проверяющий, что заказчик достиг своего лимита])
BEGIN
ROLLBACK TRANSACTION
RAISERROR ('[сообщение об ошибке]', 16, 1)
END
END
Два ключевых момента.
- триггер
AFTER INSERT. Т.е. запись создастся все равно. ROLLBACK TRANSACTION- это то, что сотрет запись, если она не нужна
ответ дан 22 нояб. 2015 в 22:33
cyadvert
7,0351 золотой знак19 серебряных знаков31 бронзовый знак
-
если триггер не принимает передаваемые параметры, то как проверить это к заказчику то есть определенный заказчик не может больше 5 в неделю и 100 книг..?silverxak– silverxak2015年11月23日 20:05:18 +00:00Commented 23 нояб. 2015 в 20:05
-
Как это "триггер не принимает параметры"? Есть же New и Old recordset...cyadvert– cyadvert2015年11月23日 20:07:07 +00:00Commented 23 нояб. 2015 в 20:07
-
хм хм..запутали, триггер пишется под определенное действие - вставка/удаление/изменение...и срабатывает при нем допустим - insert into table values (val1, val2 val3) ..вот как перехватить эти самые val1/2/3 ?silverxak– silverxak2015年11月23日 20:10:21 +00:00Commented 23 нояб. 2015 в 20:10
-
да, под определенное действие С ОПРЕДЕЛЕННОЙ ЗАПИСЬЮ. Вам нужно почитать про ms-sql триггеры. Но в общих чертах так: когда триггер обрабатывает запись, она зранится в системных скрытых таблицах.
inserted- это новая запись.deleted- это старая запись. Т.е. для триггера на вставкуdeletedне существует. Для триггера наupdate- существуют оба. Для триггера наdeleteне существуетinserted.cyadvert– cyadvert2015年11月23日 20:16:42 +00:00Commented 23 нояб. 2015 в 20:16 -
читаю читаю...особо ничего про них..silverxak– silverxak2015年11月23日 20:18:39 +00:00Commented 23 нояб. 2015 в 20:18
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопросlang-sql