Главная страница

Курсовая 5 класс. Мой курсовой БД. 1 Анализ предметной области. 5 Постановка задачи 11


Скачать 2.77 Mb.
Название1 Анализ предметной области. 5 Постановка задачи 11
АнкорКурсовая 5 класс
Дата17.03.2023
Размер2.77 Mb.
Формат файлаdoc
Имя файлаМой курсовой БД.doc
ТипРеферат
#997093
страница6 из 8
1   2   3   4   5   6   7   8

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

1   2   3   4   5   6   7   8


написать администратору сайта