Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Записка по курсовому проекту ББД.doc
Скачиваний:
50
Добавлен:
29.02.2016
Размер:
861.7 Кб
Скачать

3.2 T-sql-определения триггеров

1. proverka _date - Триггер, который будет запрещать добавления записи в таблицу «Договор», если дата начала договора старше текущей даты.

CREATE TRIGGER [dbo].[proverka_date] /*Обьявляем имя триггера*/

ON [dbo].[Договор] /*Указываем имя таблицы, с которой будет связан триггер*/

FOR INSERT /*Указываем операцию, на кот. будет срабатывать триггер (здесь вставку)*/

AS

IF NOT EXISTS(SELECT * FROM [dbo].[Договор], inserted

WHERE inserted.Начало < GETDATE())/*Если Начало меньше сегодняшней даты, то такой договор не существует*/

BEGIN

RAISERROR ('Введена некорректная дата начала', 11, 1);

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

/*inserted – временная таблица, куда заносятся добавляемые данные*/

2. Delete_doljnik – Триггер, который будет разрешать удаление данных из таблицы «Должники» при наличии прав администратора.

CREATE TRIGGER [dbo].[delete_doljnik] /*Обьявляем имя триггера*/

ON [dbo].[Должники] /*Указываем имя таблицы, с которой будет связан триггер*/

FOR DELETE/*Указываем операцию, на кот. будет срабатывать триггер (здесь удаление)*/

AS

IF EXISTS( SELECT * FROM dbo.Должники

WHERE (CURRENT_USER <> 'dbo')) /*Если текущий пользователь не владелец базы*/

BEGIN

PRINT 'У вас нету прав для удаления записи'

ROLLBACK TRANSACTION/*откат (отмена) транзакции*/

END

3. Delete_zarplata - Триггер, который будет запрещать удаление записей в таблице «Зарплата», если дата выдачи меньше трех месяцев.

CREATE TRIGGER [dbo].[delet_zarpl]

ON [dbo].[Зарплата]

FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь удаление)*/ AS IF EXISTS (SELECT * FROM deleted

WHERE deleted.[Дата выдачи]>(SELECT DATEADD([DAY], -90, GETDATE()))))) /*Если введененная дата больше разницы текущей даты и текущей даты -90 дней*/

BEGIN PRINT 'Не возможно удалить запись о зарплате менее 3х месяцев'

ROLLBACk TRANSACTION /*откат (отмена) транзакции*/

END

4. Proverka_date_zarplata - Триггер, который будет срабатывать при изменении данных таблицы «Зарплата» и проверять дату выдачи зарплаты.

CREATE TRIGGER [dbo].[proverka_date_zarplata]

ON [dbo].[Зарплата]

FOR UPDATE /*Указываем операцию, на кот. будет срабатывать триггер (здесь обновление)*/

AS IF UPDATE([Дата выдачи])

AND datename(dw,GETDATE()) in ('Пятница') )) /*Если текущий день недели «Пятница»*/

BEGIN PRINT 'Вы же сегодня не работаете!'

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

5. Insert_zayavka - Триггер, который будет проверять дату подачи заявки при добавлении записей в таблицу «Заявки».

CREATE TRIGGER [dbo].[insert_zayavka]

ON [dbo].[Заявки]

FOR INSERT /*Указываем операцию, на кот. будет срабатывать триггер (здесь вставка)*/AS

BEGIN IF EXISTS (SELECT * FROM [dbo].[Заявки], [inserted]

WHERE [inserted].[Дата подачи заявки]>GETDATE()) /*Если Дата подачи заявки больше текущей даты*/

BEGIN PRINT ('Неверно введена дата подачи заявки')

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

6. Update_zayavki - Триггер, который будет записывать информацию о заявках в талицу Updated_zzayavki при обновлении записей в таблице «Заявки».

СREATE TRIGGER [dbo].[update_zayavki]

ON [dbo].[Заявки] FOR UPDATE /*Указываем операцию, на кот. будет срабатывать триггер (здесь обновление)*/

AS INSERT INTO UpdatedZayavk ([Код заявки],[Номер квартиросъемщика], Описание, [Дата изменения], Статус) /*Добавляем измененную запись в таблицу UpdatedZayavk */

SELECT [Код заявки],[Номер квартиросъемщика],

Описание, datename(month, month(getdate())), Результат FROM inserted

BEGIN PRINT ('Запись об изменениях занесена в таблицу')

END

7. Zayavki_del - Триггер, который будет запрещать удаление записей из таблицы «Заявки», при наличии статуса «В процессе».

CREATE TRIGGER [dbo].[zayavki_del] ON [dbo].[Заявки] FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь удаление)*/

AS IF EXISTS (SELECT count(*) from dbo.Заявки)

IF EXISTS(SELECT * FROM dbo.Заявки, deleted WHERE deleted.Результат='В процессе') /*Если удаляемая заявка имеет Результат=”В процессе”*/

BEGIN PRINT ('Вы не можете удалить запись со статусом "В процессе"')

ROLLBACK TRANSACTION/*откат (отмена) транзакции*/ END

8. Zapret_deleted_otdel - Триггер, который будет запрещать удаление записи из таблицы «Отделы» при наличии в удаляемом отделе сотрудников.

CREATE TRIGGER [dbo].[zapret_delet_otdel] /*Обьявляем имя триггера*/

ON [dbo].[Отделы] /*Указываем имя таблицы, с которой будет связан триггер*/

AFTER DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь удаление)*/

AS

IF EXISTS(SELECT * FROM deleted, dbo.Отделы, dbo.Сотрудники

WHERE deleted.[Номер отдела] IN (SELECT dbo.Сотрудники.[Номер отдела] /*Если удаляемый отдел содержит записи в таблице сотрудники с номером удаляемого отдела */

FROM dbo.Сотрудники)) /*Если в таблице Сотрудники есть записи с Номером отдела*/

BEGIN PRINT('В отделе находятся сотрудники!')

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/ END

9. Deleted_sotrdnik - Триггер, который будет записывать информацию о удаляемых записях в таблице «Сотрудники».

CREATE TRIGGER [dbo].[deleted_sotrudnik]

ON [dbo].[Сотрудники] FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь удаление)*/

AS INSERT INTO dbo.DELETED_SOTRUNDNIKI

([Табельный номер], [Номер отдела], Фамилия, Имя, [Дата удаления])

SELECT deleted.[Табельный номер], deleted.[Номер отдела],

deleted.Фамилия, deleted.Имя, (CAST(YEAR(getdate()) AS varchar(50))+'.'+ CAST(MONTH(getdate()) AS varchar(50))+'.'+CAST(DAY(getdate()) AS varchar(50))) FROM deleted /*вставляем удаляемую запись в таблицу Deleted_sotrudniki*/ BEGIN

RAISERROR ('Выполнено успешно', 11, 1); END

10. Proverka_otdela - Триггер, который будет проврять существование отдела упри добавлении записи в таблицу «Сотруники».

CREATE TRIGGER [dbo].[proverka_otdela]

ON [dbo].[Сотрудники] FOR INSERT /*Указываем операцию, на кот. будет срабатывать триггер (здесь вставка)*/ AS

IF NOT EXISTS (SELECT * FROM dbo.Сотрудники, inserted

WHERE inserted.[Номер отдела] IN (SELECT dbo.Отделы.[Номер отдела] FROM dbo.Отделы)) /*Если в таблице отделы не существует отдела с номером отдела вставляемой записи */

BEGIN RAISERROR ('Отдела не существует', 11, 1);

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

11. Proverka_sovershennolet - Триггер, который будет проверять возраст нового сотрудника.

CREATE TRIGGER [dbo].[proverka_socershennoletie]

ON [dbo].[Сотрудники] FOR INSERT /*Указываем операцию, на кот. будет срабатывать триггер (здесь вставка)*/AS

IF EXISTS(SELECT * FROM dbo.Сотрудники, inserted

WHERE YEAR(inserted.[Дата рождения])>(YEAR(GETDATE())-18)) /*если Дата рождения вставляемой записи сотрудника меньше 18 лет */

BEGIN RAISERROR ('Сотруднику нету 18 лет!!!', 11, 1);

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END