Программирование >>  Программирование баз данных 

1 ... 51 52 53 [ 54 ] 55 56 57 ... 346


строку со значением номера телефона в формате, не соответствующем ожиданиям, но допустим при этом такую ошибку, которая действительно может встретиться на практике при вводе номера телефона:

INSERT INTO Customers (CustomerName, Addressl, Address2, City, State, Zip,

Contact, Phone, FedlDNo, DatelnSystem) VALUES

( MyCust,

123 Anywhere, I I

Reno ,

NV ,

80808,

Joe Bob,

555-1212,

931234567 ,

GETDATE ())

Теперь введем в действие ограничение, позволяющее управлять форматированием поля Phone:

ALTER TABLE Customers

ADD CONSTRAINT CN CustomerPhoneNo CHECK

(Phone LIKE ( [0-9] [0-9] [0-9]) [0-9] [0-9] [0-9]- [0-9] [0-9] [0-9] [0-9] )

Ho после вызова этого оператора на выполнение появляется следующее сообщение об ошибке:

Msg 547, Level 16, State 1, Line 1

ALTER TABLE statement conflicted with COLUMN CHECK constraint CN CustomerPhoneNo. The conflict occurred in database Accounting, table Customers, column Phone .

СУБД SQL Server вводит ограничение в действие только при том условии, что существующие данные соответствуют критериям, заданным в ограничении. В связи с этим для ввода ограничения в действие необходимо либо исправить существующие данные, либо ввести опцию WITH NOCHECK в оператор ALTER. Для этого достаточно дополнительно указать ключевое слово WITH NOCHECK в операторе ALTER, как показано ниже.

ALTER TABLE Customers WITH NOCHECK

ADD CONSTRAINT CN CustomerPhoneNo CHECK

(Phone LIKE ( [0-9] [0-9] [0-9]) [0-9] [0-9] [0-9]- [0-9] [0-9] [0-9] [0-9] )

Если после этого будет снова вызван на выполнение тот же оператор INSERT, введенное ограничение проявит свое действие и попытка ввода данных будет отвергнута (напомним, что в прошлый раз этот оператор вставки был выполнен беспрешггственно): Msg 547, Level 16, State О, Line 1

The ALTER TABLE statement conflicted with the CHECK constraint CN CustomerPhoneNo. The conflict occurred in database Accounting , table dbo.Customers , column Phone.



После того как оператор INSERT будет исправлен с учетом введенного ограничения, а затем снова вызван на выполнение, операция вставки строки завершится успешно:

INSERT INTO Customers (CustomerName, Addressl, Address2, city. State, Zip,

Contact, Phone, FedlDNo, DatelnSystem) VALUES

(MyCust , 123 Anywhere,

Reno, NV , 80808,

Joe Bob,

(800)555-1212,

931234567, GETDATE ())

Теперь выполним оператор SELECT применительно к таблице Customers. Приведенные ниже результаты показывают, что в столбце Phone этой таблицы имеются данные, соответствующие и не соответствующие критериям ограничения CHECK.

SELECT CustomerNo, CustomerName, Phone FROM Customers CustomerNo CustomerName Phone

1 Billy Bobs Shoes (360) 555-1234

2 Customerl 553-1212

3 MyCust 555-1212

5 MyCust (800) 555-1212

(2 row(s) affected)

Введенные ранее данные сохранены, поскольку отсутствует информация, позволяющая внести в них уточнения, а ввод новых данных осуществляется только после проверки их соответствия вновь заданным критериям.

Временная отмена существующего ограничения

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

Безусловно, одним из способов решения этой задачи может стать уничтожение ограничения, ввод требуемых данных, а затем повторное задание того же ограничения с использованием опции WITH NOCIfflCK. Но это- слишком сложный способ! К счастью, можно обойтись без вьшолнения всех этих действий. Вместо этого достаточно вьшол-нить оператор ALTER с опцией NOCHECK, который отменяет действие рассматриваемого



ограничения. Ниже приведен пример, в котором показано, как отменить ограничение CHECK, введенное в действие в одном из операторов из предыдущего раздела.

ALTER TABLE Customers NOCHECK

CONSTRAINT CN CustomerPhoneNo

После этого можно снова выполнить тот же оператор INSERT, который, как уже было проверено ранее, отвергается СУБД SQL Server, если ограничение введено в действие:

INSERT INTO Customers (CustomerName, Addressl, Address2, City, State, Zip,

Contact, Phone, FedlDNo, DatelnSystem) VALUES

(MyCust, 12 3 Anywhere,

Reno,

NV ,

80808,

Joe Bob ,

555-1212,

931234567,

GETDATE ())

Ha этот раз с помощью оператора INSERT удается ввести в таблицу данные, не соответствующие условиям ограничения.

В связи с указанной возможностью отменять ограничения представляет также интерес вопрос о том, как узнать, отменено ли действие какого-то конкретного ограничения, или нет. В СУБД SQL Server предусмотрена процедура sp helpconstraint, позволяющая определить состояние ограничения, которая уже рассматривалась в данной главе. Оператор, с помощью которого можно использовать эту процедуру применительно к таблице Customers, является несложным:

EXEC sp helpconstraint Customers Object Name

Customers

constraint type constraint name

DEFAULT on column Addressl CN Customer Address

CHECK on column DatelnSystem CN CustomerDateInSystem

DEFAULT on column DatelnSystem CN CustomerDefaultDatelnSystem

PRIMARY KEY (clustered) PK Customers 7E6CC92 0

Table is referenced by foreign key

Accounting.dbo.Orders: FK Orders Customer 03317E3D

Чтобы можно было поместить полученные результаты на страницах данной книги, правая часть строк вывода отсечена (тем не менее оставшаяся часть позволяет



1 ... 51 52 53 [ 54 ] 55 56 57 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика