Нажимаем кнопку сохранить, вводим название таблицы и жмем ОК. Таблица создана. Таким образом, создаем все таблицы нашей БД
Также в создаваемой базе данных SQL Server даёт нам возможность контролировать правильность вводимой информации. Для этого применяются ограничения на значение отдельных полей создаваемых таблиц.
Так для таблицы «tblDoctor» можно отследить, что идентификатор доктора я будет всегда числом положительным. Для этого находим нужную таблицу, раскрываем ее, щелкаем правой клавишей мыши по вкладке «Constraint» и нажимаем «New Constraint» Указываем имя ограничения.
Находим строчку «Expression», нажимаем на многоточие и в появившемся окне пишем текст ограничения
Для обеспечения правильной работы приложения, необходимо разработать схему базы данных, обеспечивающую необходимые связи между таблицами. Также необходимо избежать повторяемости данных
Для создания диаграммы находим свою БД, раскрываем ее, щелкаем правой кнопкой на вкладку «Database Diagrams» и нажимаем «New Database Diagram»
После появиться форма со списком таблиц нашей базы данных, которые можно добавить в диаграмму. Получим диаграмму с таблицами, но без связей. Связи создаются аналогично Access т.е. нажимаем ЛКМ на поле, которое необходимо связать и не отпуская ее, ведем указатель на поле с которым требуется связать, после чего увидим:
Далее обеспечиваем целостность данных, делаем каскадным обновление и удаление записей в таблицах:
После создания всех связей, которые мы выделили при нормализации, мы получим:
Триггеры это еще одна хорошая отличительная черта SQL Server. По своим функциям они напоминают события, но уникальны они тем, что содержаться на сервере, уникальны для каждой таблицы и выходят на исполнение при изменении, добавлении или удалении записей в таблицу. Они являются «последним» барьером между клиентом и таблицами на сервере, поэтому с их помощью можно проконтролировать изменение таблиц.
Для создания тригера находим нужную нам таблицу, раскрываем ее, щелкаем правой кнопкой на вкладку «Triggers» и нажимаем «New Trigger»:
Для моей базы данных триггеры на обновление были написаны для всех таблиц . Синтаксис их похож, поэтому приведу пример на основе таблицы district:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[T_tblDistrict_UTrig] ON [dbo].[tblDistrict] FOR UPDATE AS
SET NOCOUNT ON
/* * Каскадные обновления в 'tblPacient' */
IF UPDATE(DistrictID)
BEGIN
UPDATE tblPacient
SET tblPacient.DistrictID = inserted.DistrictID
FROM tblPacient, deleted, inserted
WHERE deleted.DistrictID = tblPacient.DistrictID
END
update District set
UserName=user_name(),
[DateTime]=GetDate(),
HostName=host_name(),
ClientName=app_name()
from inserted Join District
on inserted.DistrictID=District.DistrictID
Для моей базы данных триггеры на добавление были написаны для таблиц tblDoctor, tblPacient и tblPriem.
Пример:
Для таблицы tblDoctor:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[T_tblDoctor_ITrig] ON [dbo].[tblDoctor] FOR INSERT AS
SET NOCOUNT ON
/* * ЗАПРЕТ ВСТАВКИ БЕЗ СОВПАДАЮЩЕГО КЛЮЧА В 'tblUnivers' */
IF (SELECT COUNT(*) FROM inserted) !=
(SELECT COUNT(*) FROM tblUnivers, inserted WHERE (tblUnivers.UniversityID = inserted.UniversityID))
BEGIN
RAISERROR 44447 ‘Добавление и изменение записи не допускается. Правила целостности данных требуют наличия связанной записи в таблице “tblUnivers".'
ROLLBACK TRANSACTION
END
Для таблицы tblPriem:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[T_tblPriem_ITrig] ON [dbo].[tblPriem] FOR INSERT AS
SET NOCOUNT ON
/* * ЗАПРЕТ ВСТАВКИ БЕЗ СОВПАДАЮЩЕГО КЛЮЧА В 'tblDoctor' */
IF (SELECT COUNT(*) FROM inserted) !=
(SELECT COUNT(*) FROM tblDoctor, inserted WHERE (tblDoctor.DoctorID = inserted.DoctorID))
BEGIN
RAISERROR 44447 Добавление и изменение записи не допускается. Правила целостности данных требуют наличия связанной записи в таблице "tblDoctor".'
ROLLBACK TRANSACTION
END
/* * ЗАПРЕТ ВСТАВКИ БЕЗ СОВПАДАЮЩЕГО КЛЮЧА В 'tblPacient' */
IF (SELECT COUNT(*) FROM inserted) !=
(SELECT COUNT(*) FROM tblPacient, inserted WHERE (tblPacient.Number = inserted.Number))
BEGIN
RAISERROR 44447 Добавление и изменение записи не допускается. Правила целостности данных требуют наличия связанной записи в таблице "tblPacient".'
ROLLBACK TRANSACTION
END
Для моей базы данных были написаны триггеры на удаление для всех таблиц .
Пример:
Для таблицы tblUniversity:
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [dbo].[T_tblUnivers_DTrig] ON [dbo].[tblUnivers] FOR DELETE AS
SET NOCOUNT ON
/* * Каскадные удаления в 'tblDoctor' */
При создании приложения при помощи Microsoft SQL Server язык программирования Transact-SQL является основным программным интерфейсом между приложениями и базой данных Microsoft SQL Server. Использование программ Transact-SQL подразумевает два способа хранения и выполнения.
· Можно хранить программы локально и создавать приложения, отправляющие команды SQL Server и обрабатывающие результаты.
· Можно хранить программы в виде хранимых процедур в SQL Server и создавать приложения, исполняющие хранимые процедуры и обрабатывающие результаты.
Хранимые процедуры в Microsoft SQL Server аналогичны процедурам в других языках программирования:
· они обрабатывают входные аргументы и возвращают вызывающей процедуре или пакету значения в виде выходных аргументов;
· они содержат программные инструкции, которые выполняют операции в базе данных, в том числе вызывающие другие процедуры;
· они возвращают значение состояния вызывающей процедуре или пакету, таким образом передавая сведения об успешном или неуспешном завершении (и причины последнего).
Хранимые процедуры можно выполнять с помощью инструкции Transact-SQL EXECUTE. Хранимые процедуры отличаются от функций тем, что они не возвращают значения на месте своих имен, и их нельзя непосредственно использовать в выражениях.
По сравнению с программами Transact-SQL, которые хранятся локально на клиентских компьютерах, хранимые процедуры SQL Server имеют следующие преимущества.
· Хранимые процедуры регистрируются на сервере.
· Хранимые процедуры могут иметь атрибуты безопасности (например, разрешения) и цепочки владения, кроме того, к ним можно прикреплять сертификаты. Пользователи могут обладать разрешениями на выполнение хранимых процедур вместо прямых разрешений для работы с объектами, на которые ссылаются эти процедуры.
· Хранимые процедуры позволяют сделать защиту приложений более надежной. Параметризованные хранимые процедуры могут защитить приложения от атак, осуществляемых путем инжекции кода SQL.
· Хранимые процедуры поддерживают модульное программирование. Процедуру можно создать один раз и потом по мере необходимости вызывать ее в программе любое число раз. Это делает обслуживание приложения более удобным и позволяет унифицировать доступ приложений к базе данных.
· Хранимые процедуры представляют собой именованный код, дающий возможность отсроченного связывания. Это обеспечивает уровень косвенности, упрощающий развитие программного кода.
· Хранимые процедуры позволяют уменьшить сетевой трафик. Операцию, занимающую сотни строк программного кода Transact-SQL, можно выполнить в одной инструкции, которая обрабатывает процедуру, а не отправляет этот код по сети.
Для создания хранимой процедуры находим нужную нам базу данных, раскрываем ее, щелкаем правой кнопкой на вкладку «Programmability»,там находим вкладку «Stored Procedures» и нажимаем «New Stored Procedure»:
Для Выполнения процедуры необходимо найти ее во вкладке «Stored Procedures» , нажать ПКМ и выбрать «Execute Stored Procedure»
Примеры хранимых процедур:
1) set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--Запрос для вывода списка пациентов проживающих в определенном районе
ALTER PROCEDURE [dbo].[DistrPacient]
AS
BEGIN
SELECT tblDistrict.District, tblPacient.PacientSurname, tblPacient.PacientName
FROM tblDistrict INNER JOIN
tblPacient ON tblDistrict.DistrictID = tblPacient.DistrictID
WHERE tblDistrict.DistrictID = tblPacient.DistrictID
END
2) set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--Запрос для вывода врачей и обслуживаемых ими пациентов.
ALTER PROCEDURE [dbo].[DoctorPacient]
AS
BEGIN
SELECT dbo.tblPacient.PacientSurname, dbo.tblPacient.PacientName, dbo.tblPacient.PolicyNumber, dbo.tblDoctor.LastName, dbo.tblDoctor.FirstName
FROM dbo.tblPacient, dbo.tblDoctor
WHERE dbo.tblPacient.DoctorID = dbo.tblDoctor.DoctorID
END
3) set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
--Запрос для вывода льшот у конкретных пациентов.
ALTER PROCEDURE [dbo].[ExcemptPacient]
AS
BEGIN
SELECT tblLgota.ExemptType, tblLgota.Exempt, tblPacient.PacientSurname, tblPacient.PacientName
FROM tblPacient INNER JOIN
tblLgota ON tblPacient.ExemptID = tblLgota.ExemptID
END
Представление — это виртуальная таблица, содержимое которой определяется запросом. Как и настоящая таблица, представление состоит из совокупности именованных столбцов и строк данных. Пока представление не будет проиндексировано, оно не существует в базе данных как хранимая совокупность значений. Строки и столбцы данных извлекаются из таблиц, указанных в определяющем представление запросе и динамически создаваемых при обращениях к представлению.
Представление выполняет функцию фильтра базовых таблиц, на которые оно ссылается. Определяющий представление запрос может быть инициирован в одной или нескольких таблицах или в других представлениях текущей или других баз данных.