Декларативная целостность данных. Реализация декларативной целостности данных. Ограничения PRIMARYKEY И UNIQUE, страница 2

Действие CASCADE заставляет SQL Server для инструкции DELETE удалить все строки, на которые делается ссылка (ON DELETE), и для инструкции UPDATE обновить все значения, на которые делается ссылка (ON UPDATE).  

Если в том же примере программного кода изменяется столбец CustomerId в строке из таблицы Customers, все соответствующие строки в таблице Orders для отражения изменения обновляются тем же самым значением CustomerId. 

Если для ограничения внешнего ключа задано действие ONDELETECASCADE и строка из таблицы Customers удаляется, все связанные с ней строки из таблицы Orders тоже удаляйся. 

Ограничения CHECK. Ограничения CHECK— это набор правил, которые должны проверяться до того, как будет разрешено помещать данные в таблицу. К достоинствам применения этого типа ограничений относятся следующие.

♦ их просто реализовать (они очень похожи на предложение WHERE);

♦ они проверяются автоматически;

♦ они могут повышать производительность.

Простота проверочных ограничений — огромное преимущество по сравнению с использованием триггеров. Но существуют и некоторые недостатки, к ним относятся следующие:

♦ сообщения об ошибках, поступающие от проверочных ограничений, генерируются системой, и их нельзя заменить более понятными пользователям;

♦ проверочное ограничение не может "просмотреть" предыдущее значение столбца. Это означает, что оно не может применяться для некоторых типов данных в правилах целостности данных, таких как "Обновления столбца с ценой не могут увеличить или уменьшить цену на более чем 10%."

Упражнение 1. Создание новой таблицы с ограничениями

Создать таблицу, которая хранит информацию о клиентах.

1.  Откройте среду Microsoft SQL Server Management Studio (SSMS) и установите соединение с экземпляром сервера SQL Server 2008.

2.  В окне создания запроса введите и выполните следующие инструкции SQL для создания базы данных TestDB и схемы Test.

USE master;

GO

IF DB_ID ('TestDB') IS NOT NULL DROP DATABASE TestDB;

GO

CREATE DATABASE TestDB;

GO

USE TestDB;

GO

CREATE SCHEMA Test;

GO

3.  В окне запроса в базе данных TestDB создайте новую таблицу со следующими свойствами:

•  Еѐ имя должно быть Customers(Клиенты).

•  Она должна находиться в схеме Test.

•  У неѐ должны быть столбцы.

o  CustomerId (Id клиента) -  целое число в диапазоне от 1 до 100 000. У этого столбца значения должны увеличиваться автоматически. Первое значение должно быть равно 1000, а затем каждая последующая строка должна получать значение, увеличенное на 1. Это значение должно быть первичным ключом таблицы. o Name (Имя) – строка длиной до 50 символов.

•  Ни в одном столбце не допустимы значения NULL.

Далее приведены правильные инструкции, но не используйте их, пока не попробуете создать таблицу самостоятельно.

USE TestDB;

GO

CREATE TABLE Test.Customers (

     CustomerId INT IDENTITY(1000, 1) NOT NULL 

        CONSTRAINT PKCustomers PRIMARY KEY        

    ,Name NVARCHAR(50) NOT NULL );

4.  В окне запроса в базе данных TestDB создайте новую таблицу со следующими свойствами:

•  Еѐ имя должно быть Orders (Заказы).

•  Она должна находиться в схеме Test.

•  У неѐ должны быть столбцы.

o  OrderId (Id заказа) -  целое число в диапазоне от 1 до 100 000. У этого столбца значения должны увеличиваться автоматически. Первое значение должно быть равно 1000, а затем каждая последующая строка должна получать значение, увеличенное на 1. Это значение должно быть первичным ключом таблицы.

o  OrderDate (Дата заказа) – дата. Если значение не задано, автоматически должна быть добавлена текущая дата.

o  CustomerId должен ссылаться на строку с тем же значением в столбце CustomerId таблицы Test.Customers.

•  Ни в одном столбце не допустимы значения NULL.

Далее приведены правильные инструкции, но не используйте их, пока не попробуете создать таблицу самостоятельно.

CREATE TABLE Test.Orders (

    OrderId INT IDENTITY(1000, 1) NOT NULL

    ,OrderDate DATE NOT NULL DEFAULT SYSDATETIME()

    ,CustomerId INT NOT NULL

        CONSTRAINT FKOrdersCustomerId

            REFERENCES Test.Customers (CustomerId)

);

Упражнение 2. Вставка дополнительных ограничений

В созданные таблицы ставьте дополнительные ограничения.

1.  Откройте новое окно создания запроса, введите и выполните инструкцию для использования базы данных TestDB.

USE TestDB;

2.  В окне запроса добавьте ограничение, которое провепяет, начинается ли с буквы столбец Name в таблице Test.Customers и равна ли его длина как минимум трем символам.

ALTER TABLE Test.Customers

    ADD CONSTRAINT CKCustomerName

     CHECK(Name LIKE N'[A-Z]__%');

3.  В окне запроса добавьте ограничение, которое провепяет, содержит ли текущую дату столбец OrderDate в таблице Test.Orders.

ALTER TABLE Test.Orders 

    ADD CONSTRAINT CKOrdersOrderDate

     CHECK(OrderDate = CAST(SYSDATETIME() AS DATE));

4.  Удалите базу данных.

USE master;

GO

DROP DATABASE TestDB;