Курсовая 5 класс. Мой курсовой БД. 1 Анализ предметной области. 5 Постановка задачи 11
Скачать 2.77 Mb.
|
3.2. T-SQL-определения триггеров1. Триггер, который будет запрещать удаление записей таблицы «Расписание приёма врачей поликлиники», если текущий пользователь не владелец базы данных и если поле «время приёма» содержит какое-либо значение. CREATE TRIGGER TRIGGER1_udalenie_raspisanie /*Обьявляемимятриггера*/ ON Расписание_приёма_врачей_поликлиники /*Указываем имя таблицы, с которой будет связан триггер*/ FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь на удаление)*/ AS IF ( SELECT count(*) /*проверяет*/ From Расписание_приёма_врачей_поликлиники /*записи из таблицы «Расписание приёма врачей поликлиники»*/ where Расписание_приёма_врачей_поликлиники.время_приёма is not null)>0 /*условие проверяет наличие записи в поле «время приёма». Если count возвращает значение отличное от нуля (означает, что запись есть) то первое условие IF не выполнено*/ AND (CURRENT_USER <> 'Terehov') /*вызывается функция определения имени текущего пользователя и проверяется, владелец ли он*/ BEGIN PRINT 'у вас нет прав на удаление этой записи' /*выдача сообщения о неудаче операции*/ ROLLBACK TRANSACTION /*откат (отмена) транзакции*/ END 2. Проверяет правильность номера кабинета. Существует лишь 50 кабинетов , с соответствующими номерами. CREATE TRIGGER TRIGGER2_dobavlenie_kabinet ON Расписание_приёма_врачей_поликлиники FOR INSERT AS DECLARE @@f int /*Объявляемпеременную*/ Set @@f=1 /*Присваиваем ей значение*/ IF NOT EXISTS (SELECT * FROM Расписание_приёма_врачей_поликлиники, inserted WHERE Расписание_приёма_врачей_поликлиники.Кабинет=inserted.Кабинет) Set @@f=0 IF EXISTS (SELECT * FROM Расписание_приёма_врачей_поликлиники, inserted WHERE inserted.Кабинет>1 OR inserted.Кабинет<50) /*Если номер отдела не >1 или <50, то такой кабинет не существует*/ Set @@f=0 /*Меняем значение переменной*/ If @@f=0 /*если f=0, значит были ошибки*/ BEGIN PRINT 'Неверно введены данные' /*выдача сообщения о неудаче операции*/ ROLLBACK TRANSACTION /*откат (отмена) транзакции*/ END /*inserted – временная таблица, куда заносятся добавляемые данные*/ 3. Триггер, который записывает при удалении записей из таблицы «Сведения об анализах» в отдельную таблицу информацию о дате удаления, пользователе, Перед созданием такого триггера необходимо создать таблицу DeletedItems, куда будет производится запись: CREATE TABLE DeletedItem ( [Анализ] [varchar] (25) NULL , [Дата_сдачи] [datetime] NULL, [Номер_Пациента] [int] NOT NULL, [Имя_пользователя] [varchar] (50) NULL , [Дата_удаления] [datetime] NULL /*объявляем поля таблицы*/ ) ON [PRIMARY] Сам триггер выглядит следующим образом; CREATE TRIGGER TRIGGER3_deletedby ON Сведения_об_анализах /*Связываем триггер с таблицей Сведения об анализах */ FOR DELETE AS INSERT INTO DeletedItem (Анализ, /*указываем, какие поля нужно вставить*/ Дата_сдачи, Номер_Пациента,Имя_пользователя,Дата_удаления) SELECT Анализ, Дата_сдачи, Номер_Пациента, SYSTEM_USER, /*функция определяет текущего пользователя*/ getdate() /*функция возвращает текущую дату*/ FROM deleted /*deleted – временная таблица, куда заносятся удаляемые данные*/ 4. Триггер, который записывает при добавлении записей в таблицы «Сведения о привозе препаратов » в отдельную таблицу информацию о дате удаления, пользователе. Перед созданием такого триггера необходимо создать таблицу InsertedPreparaty, куда будет производится запись: CREATE TABLE InsertedPreparaty ( /*объявляемполятаблицы*/ [Количество] [int] NULL , [Дата_привоза] [datetime] NULL , [Вырисвнные_препараты] [varchar] (25) NULL , [Имя_пользователя] [varchar] (50) NULL , [Дата_добавления] [datetime] NULL ) ON [PRIMARY] Сам триггер выглядит следующим образом; CREATE TRIGGER TRIGGER4_infoInsertPreparaty ON Сведения_о_привозе_препаратов /*Связываем триггер с таблицей Сведения о привозе препаратов */ FOR INSERT AS INSERT INTO InsertedPreparaty (Количество, /*указываем, какие поля нужно вставить*/ Дата_привоза, Вырисанные_препараты, Имя_пользователя, Дата_добавления) SELECT Количество, Дата_привоза, Вырисанные_препараты, SYSTEM_USER, /*функция определяет текущего пользователя*/ getdate() /*функция возвращает текущую дату*/ FROM inserted /*inserted – временная таблица, куда заносятся добавляемые данные*/ 5. Триггер, который записывает при изменении записей в таблице «Сведения о санаторном лечении» в отдельную таблицу информацию о дате удаления, пользователе. Перед созданием такого триггера необходимо создать таблицу UpdatedSanatoriy, куда будет производится запись: CREATE TABLE UpdatedSanatoriy ( [Санаторий] [varchar] (25) NULL , [Дата_поступления] [datetime] NULL , [Дата_выписки] [datetime] NULL , [Стоимость_Лечения] [int] NULL , [Номер_Пациента] [int] NOT NULL , [Имя_пользователя] [varchar] (50) NULL , [Дата_добавления] [datetime] NULL ) ON [PRIMARY] Триггер выглядит следующем образом: CREATE TRIGGER TRIGGER5_infoUpdateSanatoriy ON Сведения_о_санаторном_лечении /*Связываем с таблицей*/ FOR UPDATE AS INSERT INTO UpdatedSanatoriy (Санаторий, /*указываем, какие поля нужно вставить*/ Дата_поступления, Дата_выписки, Стоимость_лечения, Номер_Пациента, Имя_пользователя,Дата_добавления) SELECT Санаторий, Дата_поступления, Дата_выписки, Стоимость_лечения, Номер_Пациента, /*указываем откуда*/ SYSTEM_USER, /*функция определяет текущего пользователя*/ getdate() /*функция возвращает текущую дату*/ FROM updated /*updated – временная таблица, куда заносятся данные*/ 6. Триггер запрещает изменять в таблице «Сведения об анализах» запись полей «анализ» и «Срок_сдачи» в воскресенье. CREATE TRIGGER TRIGGER6_proverka ON Сведения_об_анализах FOR UPDATE AS IF UPDATE(Анализ) /*Проверяет, какое поле обновляется*/ AND datename(dw,GETDATE()) in ('Sunday') /*Проверяет, является ли день воскресеньем*/ BEGIN PRINT 'В воскресенье поликлиника не работает' ROLLBACK TRANSACTION END IF UPDATE(Срок_сдачи) /*Проверяет, какое поле обновляется*/ AND datename(dw,GETDATE()) in ('Sunday') /*Проверяет, является ли день воскресеньем*/ BEGIN PRINT 'В воскресенье поликлиника не работает' ROLLBACK TRANSACTION END /* datename(dw,GETDATE()) – GETDATE()получает текущую дату, datename(dw,<дата>) получает название дня недели*/ 7. Триггер, который записывает при удалении записей из таблицы «Сведения о заболевании» в отдельную таблицу информацию о дате удаления, пользователе, Перед созданием такого триггера необходимо создать таблицу DeletedZabolevanie, куда будет производится запись: CREATE TABLE DeletedZabolevanie ( [Заболевание] [varchar] (25) NULL , /*объявляем поля таблицы*/ [Выписанные_препараты] [varchar] (25) NULL , [Номер_Пациента] [int] NOT NULL , [Имя_пользователя] [varchar] (50) NULL , [Дата_удаления] [datetime] NULL ) ON [PRIMARY] Триггер: CREATE TRIGGER TRIGGER7_deletezabolevanie ON Сведения_о_заболевании /*Связываем с таблицей*/ FOR DELETE AS INSERT INTO DeletedZabolevanie /*Указываем таблицу, куда будет производиться запись*/ (Заболевание, /*Пречисляем поля таблицы*/ Выписанные_препараты, Номер_Пациента, Имя_пользователя,Дата_удаления) SELECT /*Причисляем вносимые значения*/ Заболевание, Выписанные_препараты, Номер_Пациента, Табельный_номер, SYSTEM_USER, getdate() FROM deleted /*deleted – временная таблица, куда заносятся удаляемые данные*/ 8. Триггер, который записывает при добавлении записей в таблицы «История болезни пациента» в отдельную таблицу информацию о дате удаления, пользователе. Перед созданием такого триггера необходимо создать таблицу InsertedItemPacient, куда будет производится запись CREATE TABLE InsertedItemPacient ( [ФИО] [varchar] (35) NULL , [Домашний_адрес] [varchar] (75) NULL , [Дата_Рождения] [Datetime] NULL , [Номер_Пациента] [int] NULL , [Тип_льгот] [varchar] (35) NULL , [Имя_пользователя] [varchar] (50) NULL , [Дата_удаления] [datetime] NULL ) ON [PRIMARY] Триггер: CREATE TRIGGER TRIGGER8_pacient ON История_болезни_пациента FOR INSERT AS INSERT INTO InsertedItemPacient (ФИО, Домашний_адрес, Дата_Рождения, Номер_Пациента, Тип_льгот, Имя_пользователя, Дата_удаления) SELECT ФИО, Домашний_адрес, Дата_Рождения, Номер_Пациента, Тип_льгот, SYSTEM_USER, getdate() FROM inserted 9. Триггер, запрещающий ввод значения в поле «Дата_привоза », если оно превышает номер текущего года. CREATE TRIGGER proverka_Privoz ON Сведения_о_привозе_препаратов FOR INSERT AS DECLARE @@t int /*Объявляем переменную*/ Set @@t=5 /*Присваиваем ей значение*/ IF NOT EXISTS (SELECT * FROM Сведения_о_привозе_препаратов, inserted WHERE Сведения_о_привозе_препаратов.Дата_привоза = inserted. Дата_привоза) Set @@t=0 IF EXISTS (SELECT * FROM Сведения_о_привозе_препаратов, inserted WHERE inserted.Дата_привоза >YEAR(GETDATE())) /*Проверяем, больше ли значения вводимого года, чем у текущего*/ Set @@t=0 /*Если да, то меняем значение переменной*/ If @@t=0 /*если f=0, значит были ошибки*/ BEGIN PRINT 'Неверно введена дата' /*выдача сообщения о неудаче операции*/ ROLLBACK TRANSACTION /*откат (отмена) транзакции*/ END 10. Триггер, который будет запрещать удаление записей таблицы «Сведения о льготах», если текущий пользователь не владелец базы данных и если поле «плата за лечение» содержит какое-либо значение. CREATE TRIGGER TRIGGER10_udalenie_lgoty /*Обьявляем имя триггера*/ ON Свединия_о_льготах /*Указываем имя таблицы, с которой будет связан триггер*/ FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь на удаление)*/ AS IF ( SELECT count(*) /*проверяет*/ From Свединия_о_льготах where Свединия_о_льготах.плата_за_лечение is not null)>0 /*условие проверяет наличие записи в поле «плата за лечение». Если count возвращает значение отличное от нуля (означает, что запись есть) то первое условие IF не выполнено*/ AND (CURRENT_USER <> 'Terehov') /*вызывается функция определения имени текущего пользователя и проверяется, владелец ли он*/ BEGIN PRINT 'у вас нет прав на удаление этой записи' /*выдача сообщения о неудаче операции*/ ROLLBACK TRANSACTION /*откат (отмена) транзакции*/ END |