0

Есть таблицы: заказчик, заказ, книга, книги в заявках

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 я не очень силен, и триггеры на запрет вставки не писал ни разу) спасибо заранее..

задан 22 нояб. 2015 в 21:54

1 ответ 1

0

Лучше бы все-таки все проверки делать до вставки в базу. Но если уж обязательно делать имеено триггером, то думаю вот этот вариант Вам подойдет

CREATE TRIGGER [имя триггера] AFTER INSERT AS
BEGIN
 IF EXISTS([здесь нужно вставить запрос, проверяющий, что заказчик достиг своего лимита])
 BEGIN
 ROLLBACK TRANSACTION
 RAISERROR ('[сообщение об ошибке]', 16, 1)
 END
END

Два ключевых момента.

  1. триггер AFTER INSERT. Т.е. запись создастся все равно.
  2. ROLLBACK TRANSACTION - это то, что сотрет запись, если она не нужна
ответ дан 22 нояб. 2015 в 22:33
6
  • если триггер не принимает передаваемые параметры, то как проверить это к заказчику то есть определенный заказчик не может больше 5 в неделю и 100 книг..? Commented 23 нояб. 2015 в 20:05
  • Как это "триггер не принимает параметры"? Есть же New и Old recordset... Commented 23 нояб. 2015 в 20:07
  • хм хм..запутали, триггер пишется под определенное действие - вставка/удаление/изменение...и срабатывает при нем допустим - insert into table values (val1, val2 val3) ..вот как перехватить эти самые val1/2/3 ? Commented 23 нояб. 2015 в 20:10
  • да, под определенное действие С ОПРЕДЕЛЕННОЙ ЗАПИСЬЮ. Вам нужно почитать про ms-sql триггеры. Но в общих чертах так: когда триггер обрабатывает запись, она зранится в системных скрытых таблицах. inserted - это новая запись. deleted - это старая запись. Т.е. для триггера на вставку deleted не существует. Для триггера на update - существуют оба. Для триггера на delete не существует inserted. Commented 23 нояб. 2015 в 20:16
  • читаю читаю...особо ничего про них.. Commented 23 нояб. 2015 в 20:18

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.