86820

MS SQL Query Analyzer, SQL и работа с таблицами: Учебное пособие

Книга

Информатика, кибернетика и программирование

Пособие полезно не только студентам, аспирантам, преподавателям, но и всем тем, кто хочет создавать серверные базы данных. Оно предназначено для «продвинутых» пользователей реляционных баз данных, которые готовятся стать администратором базы данных или системным администратором.

Русский

2015-04-11

3.58 MB

1 чел.

федеральное агентство по образованию

Казанский (Приволжский) федеральный университет 

Филиал в г. Набережные Челны

М.Я. Товштейн

Работа «клиента» 

с удалённой базой данных

Часть 3 

MS SQL Query Analyzer, SQL и 

работа с таблицами

Учебное пособие 

Набережные Челны 

2011

УДК 004.65(075.8)

ББК 32.973.26-018.2я73

Т 50

Печатается  по  решению редакционно-издательского совета филиала Казанского федерального университета  

от  __.__. 2011 г.

Рецензенты: А.Г. Исавнин, докт. физ.-мат. наук, доцент;

А.К. Розенцвайг, докт. техн наук, профессор,

кафедра Математического моделирования и информационных технологий в экономике, Камская инженерно-экономическая  академия ИНЭКА (КамПИ), зав. кафедрой к. ф.-м. н., доц. Смирнов Ю.Н.

Т 50

Товштейн М.Я. Работа «клиента» с удалённой базой данных. Часть 3. MS SQL Query Analyzer, SQL и работа с таблицами: учебное пособие/ М.Я. Товштейн; фил. Казанского федерального ун-та. – Набережные Челны: Лаб. операт. полиграфии, 2011. – 60 с. : ил., табл. – Библиогр.: 4 назв

Учебное пособие продолжает знакомить читателя с тем, как использовать утилиту Query Analyzer сервера MS SQL Server 2000 и структурированный язык запросов SQL, во-первых, для описания структуры таблицы базы данных и внесения исправлений в это описание, и, во-вторых, для загрузки данных в таблицы и изменения этих данных.

Качественному усвоению материала способствуют примеры и задания для самостоятельного выполнения, а также контрольные вопросы для самопроверки.

Пособие полезно не только студентам, аспирантам, преподавателям, но и всем тем, кто хочет создавать серверные базы данных. Оно предназначено для «продвинутых» пользователей реляционных баз данных, которые готовятся стать администратором базы данных или системным администратором. Такими пользователями являются, в частности, студенты специальностей «Прикладная математика и информатика», «Математические методы в экономике» и т.п.

УДК 004.65(075.8)

ББК 32.973.26-018.2я73

© Филиал КФУ в г. Набережные Челны, 2011

©  Товштейн М.Я., 2011

[1]
Введение

[2] 1. Объявление таблицы

[2.1] 1.1. Описание и стирание структуры таблицы

[2.1.1] Вопросы для самопроверки

[2.2] 1.2. Целостность и ограничители

[2.2.1] Вопросы для самопроверки

[2.3] 1.3. Ограничитель – первичный ключ

[2.3.1] Вопросы для самопроверки

[2.4] 1.4. Ограничитель – внешний ключ

[2.4.1] Вопросы для самопроверки

[2.5] 1.5. Ограничитель домена

[2.5.1] 1.5.1. NULL-значение поля

[2.5.2] 1.5.2. Значение поля, задаваемое автоматически

[2.5.3] 1.5.3. Проверяемое значение поля

[2.5.4] Вопросы для самопроверки

[3] 2. Модификация данных в таблице

[3.0.1] 2.1. Загрузка данных

[3.0.2] 2.1.1. Ввод одной строки

[3.0.3] 2.1.2. Ввод нескольких строк одним оператором

[3.0.4] 2.1.3. Копирование таблицы и её структуры

[3.0.5] Вопросы для самопроверки

[3.0.6] 2.2. Исправление данных

[3.0.7] Вопросы для самопроверки

[3.0.8] 2.3. Удаление данных

[3.0.9] Вопросы для самопроверки

[4] 3. Изменения в описании таблицы

[4.0.1] 3.1. Добавление поля

[4.0.2] 3.2. Изменение типа поля

[4.0.3] 3.3. Удаление полей и ограничителей

[4.0.4] Вопросы для самопроверки

[4.0.5] 3.4. Добавление ограничителей

[4.0.6] 3.4.1. Добавление PRIMARY KEY и  FOREIGN KEY

[4.0.7] 3.4.2. Добавление DEFAULT-ограничителей

[4.0.8] 3.4.3. Добавление ограничителей без проверки данных

[4.0.9] 3.4.4. Добавление данных без проверки ограничителей

[4.0.10] Вопросы для самопроверки

[5] 4. Упражнения

[5.0.1] 4.1. Разработайте концептуальную и логическую модели предметной области

[5.0.2] 4.2. Объявите и загрузите таблицы с помощью Enterprise Manager

[5.0.3] 4.3. Объявите и загрузите таблицы с помощью Query Analyzer

[5.0.4] 4.4. Внесите изменения в таблицы с помощью Query Analyzer

[6] Заключение

[7] Литература


Введение

«…то и дело возникают скандалы, связанные с не состыковками самих разных баз данных. Например, ситуации на границе, когда, оплатив долги в той же службе судебных приставов, люди тем не менее выехать за пределы страны не могут, так как не значатся в списках разрешенных…» 

Из статьи «Персональная госуслуга», "Российская газета" - Столичный выпуск №5467 (91), 28.04.2011

Это пособие, как понятно из названия, продолжает серию [1, 2]. В [1] повествовалось, в частности, об утилите MS SQL Enterprise Manager и о том, как помощью её графического интерфейса задавать базу данных и загружать таблицы базы данных сведениями о предметной области. В [2] рассказывалось о том, как клиенту общаться с сервером посредством другой утилиты сервера - MS SQL Query Analyzer - и как применять язык SQL для описания базы данных и корректировать параметры файлов этой БД. В данной брошюре мы будем предполагать, что Вы умеете объявлять базу данных, научились изменять параметры её файлов и что в Вашем распоряжении находится база данных коллективного пользования, представляющая некоторую предметную область. Заметим попутно, что в приводимых ниже примерах будет использоваться база данных АВТОПАРК, с которой уже мы имели дело в [1,2].

Хотелось бы сделать одно существенное замечание. Несмотря на то, что мы используем  MS SQL Server 2000 и его утилиту Query Analyzer, следует понимать, что главное – это умение грамотно использовать язык SQL, а не возможности Query Analyzer’а, хотя они довольно симпатичны. Ведь сервер может быть любым, например, System-R [3] или MySQL [4], лишь бы он воспринимал операторы SQL. Но именно в этом сомневаться не приходится, ибо все они ориентированы на работу с SQL.

Это замечание относится в полной мере также и к содержанию данного пособия. Речь пойдёт о том, как описывать таблицы базы данных, корректировать сделанное описание, а затем и вносить в таблицы соответствующие данные. Операторы SQL, используемые для этого, могут быть поняты любым сервером баз данных.

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

1. Объявление таблицы 

1.1. Описание и стирание структуры таблицы 

Описывая структуру таблицы, как известно [1], следует указать имя этой таблицы, имя каждого из её полей, типы данных, которые будут представлять эти поля, а также другие их свойства.

Структура таблицы задаётся оператором CREATE TABLE, формат которого в типичном случае таков:

CREATE TABLE ИмяТаблицы

(  ИмяПоля_1   ТипПоля_1      СвойствоПоля_1

 , ИмяПоля_2   ТипПоля_2      СвойствоПоля_2

 ,…  …  …  … …  …  …  … …  … …   …  …

 , ИмяПоля_N   ТипПоля_N    СвойствоПоля_N

)

Перед оператором CREATE TABLE полезно поставить оператор IF, проверяющий, существует ли наша таблица в базе данных, т.е. найдётся ли в системной таблице sysobjects строка с именем нашей таблицы. Если ответ «да», то можно бы таблицу и не объявлять. Но мы будем считать, что если объявление таблицы предусматривается, то оно должно быть сделано в любом случае, и «старое» объявление, если оно обнаружится, стирается.

Что касается проверки существования таблицы, то её можно делать по-разному, меняя логическое выражение в операторе развилки. Приведём три варианта.

1-й вариант был показан в [2] на рис. 2 раздела 4.1. Он иллюстрировал проверку существования базы данных при её создании. Там использовалась конструкция IS NOT NULL. Применительно к нынешнему случаю оператор IF может выглядеть так:

IF (SELECT name FROM sysobjects 

    WHERE name = 'ИмяТаблицы' AND type ='U') is not null

BEGIN  END

2-й вариант использует предикат EXISTS:

IF exists (SELECT name FROM sysobjects 

WHERE name = 'ИмяТаблицы' AND type ='U')

BEGIN  END

3-й вариант использует функцию COUNT для подсчёта количества найденных строк:

IF ( SELECT count (name) FROM sysobjects 

WHERE name = 'ИмяТаблицы' AND type = 'U' ) >  0 

BEGIN  END

Теперь – о стирании таблицы. Стирание таблицы1 – это удаление не только её содержимого, но и описания структуры, так что от таблицы не остаётся никакого следа. Такое стирание выполняется оператором

DROP TABLE ИмяТаблицы.

Замечание 1. Следует, однако, учесть, что сервер не выполнит этот оператор, если на таблицу, как на родительскую, ссылается другая таблица. В таком случае придётся удалять эту ссылку в дочерней таблице и лишь после этого стирать родительскую.

Замечание 2. Узнать результат работы оператора DROP можно программно, а не только по выводимому сервером сообщению. Для этого используется встроенная функция @@ERROR. Её надо сразу же употребить в команде развилки после оператора DROP2. Если DROP выполнился успешно, функция @@ERROR возвращает 0, иначе @@ERROR  0. Эту функцию обычно используют в транзакциях или в пользовательских процедурах, желая максимально автоматизировать процесс.

Ниже будем приводить примеры объявления таблиц тблАВТО, тблВОДИТЕЛИ или тблМАРКА в соответствии с диаграммой «сущность-связь» АВТОПАРК3, показанной на рис. 1, который повторяет рис. 5.1 из [1]. 

Рис. 1. Фрагмент ER-диаграммы АВТОПАРК

Пример 1.1. Опишем таблицу тблАвто, не указывая пока свойств полей.

Следующие пакеты решает эту задачу:

-- Проверка существования таблицы 

IF (SELECT name FROM sysobjects

WHERE name = 'тблАВТО' AND type ='U' ) is not null

     BEGIN 

         PRINT ' ***   НАШЛИ таблицу тблАВТО  *****  '

         DROP TABLE тблАВТО

         IF  @@ERROR =0

             PRINT ' ** УДАЛИЛИ таблицу тблАВТО !! ** '  

 END

GO

CREATE TABLE тблАВТО       --  Объявление таблицы

   ( НомАвто       char(10)

    , НомМарки   tinyint 

  )

             PRINT ' ***  СОЗДАЛИ таблицу тблАВТО  *****  '

GO

Вопросы для самопроверки

1. Какая системная таблица вашей базы данных и как хранит сведения о пользовательской таблице?

2. Как можно проверить, существует ли в базе данных таблица с указанным именем?

3. Зачем перед объявлением таблицы проверяют, имеется ли она в базе данных?

4. Зачем перед тем, как описать структуру таблицы, её стирают, если она уже имеется в базе данных?

5. Чем стирание таблицы отличается от удаления таблицы?

6. Как использовать функцию @@ERROR? Какие особенности у этой функции? Что обозначают два символа @?

7. Как оператором SQL описать структуру таблицы? Приведите примеры.

8. Почему при объявлении второго и последующих полей таблицы запятые удобно ставить перед именем поля?

9. Почему скобку, завершающую объявление таблицы, имеет смысл писать в отдельной строке?

***

Теперь можно заняться свойствами полей таблицы.

1.2. Целостность и ограничители 

Со свойствами полей мы знакомились, когда объявляли таблицу средствами Enterprise Manager (см. Приложение 2 в [1, 2]). Однако здесь придётся уточнить, что будем называть свойством поля. Договоримся под свойством поля понимать правило, по которому значение поля допускается для хранения в таблице. При вводе ставится заслон тем данным, которые этому правилу не удовлетворяют. Поэтому, например, показанные в упомянутом выше Приложении 2 precision (общее количество цифр десятичного числа) и scale (количество цифр после запятой) свойствами поля считать не будем. Эти параметры указываются при задании типа - DECIMAL. А вот разрешается или не разрешается полю оставаться незаполненным или быть ключевым – это примеры свойств поля.

Таким образом, свойство поля задаёт ограничение для значения поля и обеспечивает:

а) целостность таблицы,

б) целостность связей, или ссылок между таблицами,

в) целостность домена,

г) целостность, задаваемую пользователем, иначе называемую бизнес-правилом.

Напомним, что означают эти виды целостностей.

Целостность таблицы обеспечивается наличием первичного ключа (PRIMARY KEY) с непустым значением.

Целостность ссылок необходима для поддержания смысловых связей между таблицами. Она обеспечивается соответствием между ключами – первичным и внешним (FOREIGN KEY4). При наличии такой связи нельзя удалять записи из родительской таблицы или менять первичный ключ в ней, а также нельзя вставлять записи в дочернюю таблицу, если нет соответствующей связи с родительской таблицей5. Например, нельзя выдавать книгу несуществующему студенту или назначать водителем автомобиля человека, которого нет. Это ограничение действий устанавливается по умолчанию (NO ACTION).

Целостность ссылок предполагает также и так называемое каскадное удаление или каскадное изменение. Об этом подробнее говорится в разделе 1.4.

Целостность домена определяет область допустимых значений поля данного типа, в том числе и допустимость неопределённостей (NULL-значений) и значений по умолчанию (DEFAULT-значений).

Бизнес-правило – это некоторое сложное условие, которое диктуется предметной областью. Например, если со склада берётся какое-то количество товара, то требуется проверка, есть ли в наличии это количество. Для обеспечения такого рода целостности часто разрабатываются специальные процедуры (триггеры), которые привязываются к определённым таблицам и запускаются автоматически. О триггерах в этой брошюре говорить не будем. Отметим лишь, что, в отличие от других ограничителей, триггеры проверяют необходимое правило не до изменения таблицы, а после, и, если бизнес-правило не выполняется, таблица возвращается в исходное состояние.

В заключение этого параграфа -  несколько замечаний.

Замечание 1. Ограничитель можно задавать в объявлении таблицы, но можно добавить и позднее. Служебное слово для обозначения ограничителя – CONSTRAINT6.

Замечание 2. Ограничитель в объявлении таблицы может располагаться в одном из двух мест:

  •  на уровне поля, т.е. сразу же после указания типа поля,
  •  на уровне таблицы, т.е. после описания всех полей, в конце оператора CREATE, так что в таких ограничителях можно ссылаться на любые поля таблицы7. 

Замечание 3. Одному полю могут быть приписаны несколько различных ограничителей.

Замечание 4. Каждому ограничителю присваивается уникальное для всей БД имя, которое может потребоваться, например, для удаления данного ограничителя. Правило хорошего тона – имя ограничителю даёт сам пользователь, указывая его сразу же после слова CONSTRAINT. Но если человек не сделал этого, сервер сам сгенерирует имя. Тогда, чтобы его узнать, пользователю придётся выполнить одно из следующих действий:

  •  вызвать системную процедуру sp_HelpConstraint ,
  •  использовать Обозреватель объектов (Оbject Browser), выполняя следующие шаги:

а) раскрыть для нашей БД папку User Tables,в ней

б) раскрыть папку с именем нашей таблицы, в ней

в) раскрыть папку Constraints, в ней

г) найти имя нужного ограничителя.

Кстати, если ограничитель нужно удалить, делается ещё один шаг:

д) выделить правой кнопкой мыши имя найденного ограничителя и в появившемся диалоговом окне исполнить команду Delete.

Вопросы для самопроверки

1. Какие ограничения можно задавать при объявлении поля таблицы?

2. Какие правила нужно соблюдать при загрузке данных в таблицу, чтобы сохранялась целостность данных и целостность связей между таблицами?

3. Что означают PRIMARY KEY и FOREIGN KEY?

4. Есть ли разница между целостностью домена и бизнес-правилом? Если да, то в чём она? Приведите примеры.

5. Каким служебным словом обозначается ограничитель при описании структуры таблицы?

6. Равноценны ли объявление ограничителя на уровне поля и объявление его на уровне таблицы?

7. Где при объявлении указывается имя ограничителя? Может ли быть у одного ограничителя два разных имени?

8. Может ли одному полю приписываться несколько ограничителей?

9. Как узнать имя ограничителя для заданного поля?

10. Как удалить ограничитель, используя Оbject Browser ?

***

Теперь научимся задавать различные ограничители. Начнём с ограничителей, обеспечивающих целостность таблиц и целостность ссылок. Кроме того, с помощью Оbject BrowserОбозревателя объектов - попрактикуемся проверять действие ограничителей.

1.3. Ограничитель – первичный ключ 

Первичный ключ отмечается служебными словами PRIMARY KEY. Сервер для первичного ключа автоматически строит специальный файл, куда заносятся упорядоченные по возрастанию ключи вместе с указателями на физические адреса соответствующих записей таблиц. Этот файл существенно сокращает время поиска нужной записи.

Из вышеприведённых замечаний следует, что объявить поле первичным ключом можно по-разному. Проиллюстрируем различные варианты объявления поля НомАвто ключевым в таблице тблАВТО [1, 2].

Пример 1.2. Определить ограничитель на уровне поля, причём имя ему пусть присваивает сервер. Узнать это имя с помощью системной процедуры. 

После выполнения следующего пакета

CREATE TABLE тблАВТО 

( НомАвто       char(10) PRIMARY KEY

, НомМарки   tinyint

)

EXEC sp_HelpConstraint тблАВТО

GO

мы увидим на вкладке Grids области Results имя, данное сервером нашему ограничителю: PK__тблАВТО__6D0D32F4.8 

Замечание. Обратите внимание: имя снабжено префиксом PK9, за которым следует название таблицы. Рекомендуем придерживаться такого же стиля, давая имена любым ограничителям, а не только первичному ключу. 

Пример 1.3. Определить ограничитель на уровне поля, присвоив ему конкретное имя.

Решение выполняется следующим оператором

CREATE TABLE тблАВТО

( НомАвто  char(10)

             CONSTRAINT PK_тблАВТО_НомАвто PRIMARY KEY

, НомМарки    tinyint

)

Проверим целостность таблицы, используя Обозреватель объектов. В БД АВТОПАРК раскрываем список User Tables, щёлкаем правой кнопкой мыши на dbo.тблАВТО и в контекстном меню исполняем Open. При заполнении появившейся таблицы тблАВТО дважды в столбец НомАвто введём одну и ту же константу. Сервер огорчится (рис. 2). Изменим введённый номер – и сервер равнодушно его примет.

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

Пример 1.4. Объявить первичный ключ на уровне таблицы. 

Решение: 

CREATE TABLE тблАВТО

( НомАвто  char(10)

, НомМарки    tinyint  

, CONSTRAINT PK_тблАВТО_НомАвто 

                            PRIMARY KEY (НомАвто)

)

GO

EXEC sp_HelpConstraint тблАВТО

Рис. 2. Реакция сервера на нарушение целостности таблицы

Замечание 1. Обратите внимание: после PRIMARY KEY в скобках пишется имя первичного ключа.

Замечание 2. Первичный ключ, как известно, может быть не только простым, как в приведённом примере, но и составным. Для такого ключа используется объявление на уровне таблицы, при этом после слов PRIMARY KEY в скобках пишутся через запятую имена полей, образующих ключ.

Вопросы для самопроверки

1. Чем обеспечивается быстрый поиск данных с помощью первичного ключа?

2. Как объявить первичный ключ на уровне поля? на уровне таблицы?

3. В каких случаях сервер сам присваивает имя ограничителю первичного ключа?

4. Почему предпочтительнее, чтобы имя ограничителю давал пользователь, а не сервер?

5. Каких правил рекомендуется придерживаться при выборе имени ограничителя?

6. Где указывается имя поля, выбранного первичным ключом, при объявлении ограничителя PRIMARY KEY на уровне таблицы?

7. Как проверить, правильно ли объявлен первичный ключ таблицы?

8. Как объявить составной первичный ключ?

***

В таблице наряду с первичным ключом может быть и ключ внешний. Впрочем, внешний ключ может быть и в таблице, где нет первичного ключа. Давайте разберёмся, как объявляется внешний ключ и как сохранить целостность ссылок при каскадном удалении и каскадном изменении данных в таблице.

1.4. Ограничитель – внешний ключ 

Внешний ключ (FOREIGN KEY) объявляется в дочерней таблице. Он связывает её с родительской таблицей, позволяя получать сведения из обеих таблиц одновременно. Нелишне напомнить, что:

а) типы данных внешнего и первичного ключей должны совпадать;

б) внешний ключ ссылается10 только на первичный ключ, и если первичный ключ родительской таблицы - составной, то и внешний ключ должен быть составным, т.е. количество полей внешнего ключа должно быть точно таким же, как и у первичного ключа.

Покажем на примере, как поле объявляется внешним ключом.

Пример 1.5. Объявить таблицу тблВОДИТЕЛИ и в ней сделать внешним ключом поле РегНомАвт. Этот ключ должен ссылаться на поле НомАвто таблицы тблАВТО.

Решение: 

 -- ===  Проверка существования таблицы ====

IF ( SELECT COUNT (name) FROM sysobjects

WHERE name = 'тблВОДИТЕЛИ' AND  type ='U' ) >0

     BEGIN PRINT ' ***   НАШЛИ таблицу тблВОДИТЕЛИ  *****  '

                  DROP TABLE  тблВОДИТЕЛИ

                  IF  @@ERROR =0

                        PRINT ' УДАЛИЛИ таблицу тблВОДИТЕЛИ !! '

      END 

Go

 -- === Объявление таблицы ============

CREATE TABLE тблВОДИТЕЛИ

     ( ПаспНом         char (10)

        , ФамилияИО  varchar  (20)

        , ДатаРожд     smalldatetime 

        , РегНомАвт   char (10)

        , CONSTRAINT PK_тблВОДИТ_Пасп

                      PRIMARY KEY (ПаспНом)

        , CONSTRAINT FK_тблВОДИТ_РегНом

                               FOREIGN KEY(РегНомАвт)

                                REFERENCES тблАВТО (НомАвто)

   )

PRINT ' ***  СОЗДАЛИ таблицу тблВОДИТЕЛИ  ***** '

GO

EXEC sp_helpConstraint тблВОДИТЕЛИ           -- Проверка 

go

***

Теперь подробнее о целостности ссылок при каскадном удалении или изменении. Чтобы такая целостность сохранялась, предполагается, что:

1) если есть необходимость удалить запись в родительской таблице, то следует удалить также и соответствующие записи с внешним ключом в дочерней таблице (этот факт отмечается словами ON DELETE CASCADE), 

2) если есть необходимость первичный ключ заменить на новый11, то это новое значение должно появиться и в качестве внешнего ключа в дочерней таблице (этот факт отмечается словами ON UPDATE CASCADE12).

Рассмотрим пример.

Пример 1.6. Объявить таблицу тблАВТО с внешним ключом НомМарки, которым эта таблица связывается с (родительской) таблицей тблМАРКА. При этом надо учесть, что:

(1) если из тблМАРКА удалится строка с данными о марке автомобиля, то и в тблАВТО должны удалиться все сведения об автомобилях данной марки;

(2) если в тблМАРКА изменится значение какого-либо ключевого поля, то такое же новое значение должен принять внешний ключ в таблице тблАВТО.

Это задание выполнится, если указать при объявлении внешнего ключа каскадные операции ON DELETE CASCADE и ON UPDATE CASCADE.

CREATE TABLE тблАВТО

( НомАвто  char(10)

, НомМарки    tinyint  

, CONSTRAINT PK_тблАВТО_НомАвто

               PRIMARY KEY(НомАвто)

        , CONSTRAINT FK_ тблАВТО _НомМарки

                       FOREIGN KEY(НомМарки)

             REFERENCES тблМАРКА (НомМарки)

              ON DELETE CASCADE   -- Запятая не ставится! 

              ON UPDATE CASCADE

)

Пояснение. Сравните с примером 1.5 и обратите внимание здесь на то, что имя НомМарки носит как первичный, так и внешний ключ, поэтому оно в ограничителе использовалось дважды: 1-й раз - как имя внешнего ключа, 2-й раз – как имя первичного ключа таблицы тблМАРКА.

Вопросы для самопроверки

1. Что называется внешним ключом?

2. Может ли внешний ключ состоять из нескольких полей?

3. Каким условиям должен удовлетворять внешний ключ, чтобы сохранялась целостность связей?

4. Как объявляется внешний ключ? Где указывается имя родительской таблицы и имя поля – первичного ключа?

5. Когда требуется выполнять каскадное удаление (изменение)?

6. Может ли каскадное удаление использоваться отдельно от каскадного изменения? Если да, то в каких случаях ( приведите примеры)?

***

Теперь узнаем, как обеспечить целостность домена.

1.5. Ограничитель домена

1.5.1. NULL-значение поля

Напомним: NULL – это специальная метка того, что поле – пустое, неопределённое. В большинстве случаев в каждое поле таблицы вводится конкретное значение. Для ключевого поля, например, это – необходимое условие целостности таблицы. Но в жизни, в предметной области, возможны ситуации, когда конкретное значение (неключевого!) поля неизвестно. Например, водителю ещё не определён автомобиль, на котором ему выполнять заявки, и поэтому поле НомМарки таблицы тблАВТО остаётся до какого-то времени пустым.

Возможность оставлять поле таблицы незаполненным сервер предусматривает по умолчанию13. Но можно запретить такую «вольность», если в операторе CREATE TABLE написать служебные слова NOT NULL сразу после типа данных (включая размер) поля. Тогда любую попытку ничего не вводить в это поле сервер отметит как ошибку. 

1.5.2. Значение поля, задаваемое автоматически

Если заранее пользователь знает, какое значение примет поле, и сообщит об этом серверу, то сервер может сам ввести это значение. При этом обеспечивается надёжность и корректность данных, сокращается общее время их ввода. Возможны два варианта:

  1.  значение поля изменяется, увеличиваясь на постоянную величину при переходе от строки к строке,
  2.  значение поля не меняется, оставаясь таким, каким его определил пользователь.

1-й вариант удобен для ключевого поля: обеспечивается автоматическая нумерация строк таблицы. Такой ключ иногда называют суррогатным. Он зачастую бывает предпочтительнее выбираемых в качестве первичного ключа номера паспорта или табельного номера, поскольку: а) короче (всего 4 байта), б) сокращает вероятность ошибочного ввода, в) не требует изменений таблиц в случае смены номера паспорта или табельного номера.

Свойство поля автоматически изменяться задаётся так:

identity (seed, increment) 14

Как видим, это свойство уже знакомо тем, кто задавал таблицу с помощью Enterprise Manager (см. [1] и  [2, Приложение 2]). Напомним, что Seedэто значение, которое присваивается первой записи этого поля в таблице, а Increment величина, автоматически добавляемая к значению поля, имеющего свойство Identity, т.е. шаг приращения. 

Ограничитель Identity назначается только одному, причём целочисленному полю в таблице.

2-й вариант также описан в [1] и [2, Приложение 2] как Default Valueзначение по умолчанию. В качестве такого значения могут использоваться как константы, так и результаты вычисления различных выражений, в том числе и встроенных функций.

Синтаксис: Default выражение.

Сделаем несколько важных замечаний.

Замечание 1. О параметрах identity-поля (seed и increment) и текущее значение этого поля можно узнать с помощью системных функций

  •  ident_incr ('ИмяТаблицы'),
  •  ident_seed ('ИмяТаблицы'),
  •  ident_current('ИмяТаблицы')

Замечание 2. В процессе работы с таблицей в данных, лежащих в identity-столбце, могут появляться «разрывы». Например, если из таблицы, в которой ключевое identity-поле принимало значения 1, 2, 3, 4, удалить строки с ключами 2 и 3, то при вставке новой строки ключу припишется значение 5.

Замечание 3. Автоматическое заполнение identity-поля можно отключать и разрешать (после отключения) оператором

SET IDENTITY_INSERT ИмяТаблицы Сост

Здесь Сост{ON,OFF}, причём установка ON разрешает пользователю самому вписывать значения identity-поля (надо только знать, какие именно!), а установка Сост=OFF отнимает у пользователя право заносить значение этого поля, возвращая это право серверу.

Замечание 4. Величину параметра Seed для Identity-поля можно сделать отличной от той, которая была установлена при описании поля. Для этого используют оператор

DBCC CHECKIDENT(ИмяТаблицы, RESEED, НовЗначениеSeed).

Здесь НовЗначениеSeed – новое значение параметра Seed.

Замечание 5. При использовании DBCC CHECKIDENT следует сделать так, чтобы НовЗначениеSeed не попало в диапазон уже использованных значений. Иначе может быть нарушена уникальность значения ключевого поля, и сервер вас осудит за это. Чтобы не допустить такую ошибку, рекомендуется узнать текущее (максимальное) значение identity-поля, используя функцию ident_current.

Замечание 6. Ограничители Null, Not null, Identity и Default15 объявляются на уровне поля. Поэтому, в частности, при написании выражения в определении Default нельзя ссылаться на другие поля таблицы.

Замечание 7. Default может использоваться для полей любых типов, кроме тех, для которых указано Identity.

Посмотрим пример того, как установить ограничители Identity, Default и применить функции ident_incr, ident_seed, ident_current.

Пример 1.7. Объявить таблицу тблМАРКА так, чтобы:

а) ключевое поле НомМарки менялось от 1 с шагом 1,

б) поле Груз(т) по умолчанию принимало значение 1.5.

Показать на вкладке Grids состояние поля тблМАРКА, имеющего ограничитель Identity.

Решение  дают следующие операторы.

CREATE TABLE тблМАРКА (

 НомМарки    tinyint IDENTITY (1,1)

, Марка         char(25) NOT NULL

, [Груз(т)]    decimal (4, 1)

CONSTRAINT DF_тблМАРКА_Груз DEFAULT 1.5

, [Длина(м)]    decimal (4, 1)

, [Ширина(м)] decimal (3, 1)

, [Высота(м)]  decimal (3, 1)

, CONSTRAINT PK_тблМАРКА _НомМарки

                                        PRIMARY KEY ( НомМарки)   

)

IF @@ERROR=0

        PRINT ' === Определили тблМАРКА ===== '

GO    -- Посмотрим состояние identity-поля

SELECT   ident_incr    ('тблМАРКА') AS НачЗнач

             , ident_seed   ('тблМАРКА') AS ШагПрогрессии

             , ident_current('тблМАРКА') AS ТекЗнач

 EXEC sp_HelpConstraint  тблМАРКА  --Для проверки

GO

1.5.3. Проверяемое значение поля

Значения некоторых полей должны удовлетворять определённым условиям, защищающим от смысловых и/или технических ошибок. Например, возраст водителя должен находиться в заданном диапазоне, дата рождения должна быть меньше, чем текущая дата, и т.п. Логическое выражение, задающее условие, указывается после служебного поля CHECK и заключается в скобки. Рассмотрим пример.

Пример 1.8. В таблице тблВОДИТЕЛИ установить проверку возраста водителя: возраст должен быть более 18 лет.

Решение. При задании проверяемого условия воспользуемся встроенными функциями GetDate( ) и Year (Дата) 16. Тогда ограничитель CHECK может выглядеть так, как на рис. 3.

Рис.3. Реакция сервера на невыполнение условия CHECK

Обратите внимание на следующее:

1) дата здесь задаётся в формате гггг-мм-дд,

2) поле РегНомАвт можно оставлять неопределённым (NULL),

3) Буйнову В.В., который родился в 1998 году, в 2011 году стукнуло всего 13 лет, и на это отреагировал сервер, запретив такую дату,

4) можно, как и при работе с Enterprise Manager, вводить данные в графическом режиме – на рисунке видно (правый верхний угол) состояние таблицы тблАВТО, с которой можно работать наряду с тблВОДИТЕЛИ.

Вопросы для самопроверки

1. Что означает символ NULL?

2. Какое отношение к ключевому полю имеет символ NULL?

3. Как можно с помощью оператора DDL показать, что значение поля в таблице не может быть неопределённым?

4. Чем удобна автонумерация строк таблицы и как она задаётся?

5. Всегда ли при автонумерации соответствующий столбец таблицы демонстрирует арифметическую прогрессию? Почему?

6. Как узнать начальное и текущее значение поля, снабжённого свойством Identity?

7. Какой оператор может изменить начальное значение identity-поля? Какие ошибки могут возникнуть при таком переопределении?

8. Как можно отключать автоматическое заполнение identity-поля?

9. Как можно задать значение поля, заносимое сервером «по умолчанию»?

10. Какие операнды можно использовать при задании выражения в ограничителе Default? Приведите примеры.

11. Зачем используется ограничитель Check? Как его задать при описании таблицы?

12. Можно ли на уровне таблицы задать ограничители Identity, Default, Null ? Почему?

***

Вы познакомились с тем, как посредством SQL объявлять таблицы и ограничители. Умеете также вводить и корректировать данные в таблице, удалять ограничители, строки таблицы и сами таблицы. Но делаете это с помощью Обозревателя объектов, опять-таки без протоколирования, как и при работе с Enterprise Manager. Пора всё же научиться для этих целей использовать SQL17. Начнём с трёх операторов языка DML, которые позволяют вносить данные (INSERT), исправлять их (UPDATE) и удалять (DELETE).

2. Модификация данных в таблице

2.1. Загрузка данных

2.1.1. Ввод одной строки

Оператор INSERT позволяет вставлять в уже объявленную таблицу новые данные. Он имеет две формы, в зависимости от того, всем или лишь некоторым полям таблицы присваиваются значения. В простейшем случае INSERT имеет вид:

INSERT INTO ИмяТаблицы

          VALUES (Зн1, Зн2 , … , Знn)

Такой оператор вносит значения Зн1, Зн2 , … , Знn  в одну строку таблицы в том порядке, в каком соответствующие поля были объявлены оператором CREATE TABLE. 

Но не всегда надо заносить сведения во все поля. Например, не надо вводить данные в IDENTITY-поля, можно не заполнять DEFAULT- и NULL-поля. Поэтому употребительнее вторая форма INSERT. В ней после имени таблицы в скобках перечисляются имена тех полей строки (одной!), в которые вносятся данные. Причём их порядок может отличаться от порядка перечисления в CREATE TABLE:

INSERT INTO 

       ИмяТаблицы (И1,  И2, , … , Иk  )

          VALUES     (Зн1, Зн2 , … , Знk )

Сделаем несколько замечаний по поводу этой формы.

Замечание 1. Должно быть взаимно-однозначное соответствие между списком И1,  И2, , … , Иk имён полей и списком Зн1, Зн2 , … , Знk  их значений. Рекомендуется даже по возможности записывать их одно под другим – так легче контролировать правильность ввода.

Замечание 2. Кроме констант для задания значений полей можно использовать выражения, в частности - встроенные функции.

Замечание 3.  Если имя поля в списке отсутствует, полю присваивается либо NULL, либо значение, предусмотренное по умолчанию. 

Замечание 4. Если требуется явно ввести значение NULL, его надо писать без апострофов, т.к. это - служебное слово. Однако, явно вводить NULL-значение внешнего ключа нельзя – сервер сочтёт это нарушением целостности связей. А неявно, т.е. по умолчанию, - можно.

Замечание 5. Строка символов, а также дата в списке VALUES заключаются в апострофы.

Замечание 6. Рекомендуется в начале работы с базой данных установить привычный нам (европейский) формат даты в виде день.месяц.год. Установка эта делается оператором18 SET DATEFORMAT dmy.

Пример 2.1. Записать несколько строк в таблицу тблМАРКА, учитывая, что НомМарки является суррогатным ключом, а в поле Груз(т) может вноситься значение по умолчанию.

Решение показано на рис.4. Обратите внимание на порядок ввода данных для ГАЗель-тент.

Рис. 4. Ввод строк в таблицу тблВОДИТЕЛИ

Пример 2.2. Записать пару строк в таблицу тблВОДИТЕЛИ.

Решение (с учётом замечаний 4-6) показано на рис.5.

Рис. 5. Ввод строк в таблицу тблВОДИТЕЛИ

2.1.2. Ввод нескольких строк одним оператором

В предыдущем разделе мы узнали, как одним оператором INSERT вставить в таблицу одну строку. Однако, INSERT позволяет выполнять и более мощные вставки. Можно в одну таблицу, например, А, перенести несколько строк, выбранных по заданному условию из другой таблицы В. Сочетание операторов INSERT и SELECT в общем случае такое:

INSERT INTO 

   ИмяТаблицы_А1,  И2, , … , Иk  )

             SELECT     И1,  И2, , … , Иk 

              FROM ИмяТаблицы_В

                  WHERE  УсловиеВыборки

Разумеется, если копируются все поля, то перечисление их имён можно опустить. Тогда операторы INSERT и SELECT выглядят проще:

INSERT INTO  ИмяТаблицы_А 

   SELECT  * 

     FROM ИмяТаблицы_В  WHERE  УсловиеВыборки

Замечание 1. Таблица А, в которую переносятся строки из таблицы В, должна быть предварительно объявлена. 

Замечание 2. В новую таблицу А никакие ограничители, наложенные на поля таблицы В, не переносятся автоматически. В частности, если в таблице А не было объявлено ключевое поле, то оно и не появится после копирования строк, даже если было объявлено в таблице В. Это может быть причиной появления дубликатов при повторном внесении строк в таблицу А.

Замечание 3. УсловиеВыборки, которое пишется после WHERE, может быть как обычной операцией сравнения, так и довольно сложным выражением, использующим, например, вложенные запросы.

Пример 2.3. Допустим, что в базе данных АВТОПАРК имеется архивная таблица тблВОДИТЕЛИ_Арх. Перенести в неё из таблицы тблВОДИТЕЛИ паспортные номера и фамилии тех водителей, чьи фамилии не начинаются на букву «В».

Решение:

INSERT  INTO тблВОДИТЕЛИ_Арх

                (ПаспНом,  ФамилияИО )

  SELECT  ПаспНом,  ФамилияИО

    FROM тблВодители

          WHERE  ФамилияИО  NOT Like 'В%'

2.1.3. Копирование таблицы и её структуры

Сочетание INTOSELECT в операторе INSERT позволяет, как мы видели, переносить строки в таблицу A из другой таблицы B. Оказывается, то же может делать и сочетание SELECTINTO, причём без INSERT. Важным фактом, отличающим этот случай от описанного в п. 2.1.2, является тот, что здесь таблицу A не надо объявлять заранее! Но остаётся справедливым замечание 2 насчёт отсутствия ограничителей полей в новой таблице.

Оператор копирования из таблицы B строк, содержащих поля с именами И1,  И2, , … , Иk , в необъявленную таблицу A выглядит так:

SELECT И1,  И2, , … , Иk

INTO  ИмяТаблицы_А

 FROM ИмяТаблицы_В

   WHERE  УсловиеВыборки

Этот оператор можно использовать также для того, чтобы без оператора CREATE TABLE создать копию структуры уже существующей таблицы. Для этого нужно сделать ложным УсловиеВыборки, чтобы блокировать перенос строк:

SELECT *

INTO  ИмяТаблицы_А

 FROM ИмяТаблицы_В  WHERE 1=0.

Действительно, при выполнении этого оператора сначала создастся структура таблицы А, подобная структуре таблицы В, но ни одна строка таблицы В не перепишется в таблицу А, поскольку не будет выполняться условие 1=0.

Рассмотрим пример переноса данных из одной таблицы в другую, не объявленную заранее.

Пример 2.4. Пользователь несколько раз подряд по ошибке выполнил пример 2.3, не обратив внимания на замечание про отсутствие ограничителей в новой таблице. Поэтому в таблице тблВОДИТЕЛИ_Арх оказались ненужные строки-дубликаты. Как избавиться от них, оставив один набор без повторяющихся строк?

Решение. Известно, что служебное слово DISTINCT в операторе SELECT позволяет избавиться от строк-дубликатов. Поэтому создадим новую таблицу тблВОДИТЕЛИ_Арх1, в которую перепишем таблицу тблВОДИТЕЛИ_Арх, избавленную с помощью DISTINCT от повторяющихся строк. После этого можно удалить тблВОДИТЕЛИ_Арх.

SELECT  Distinct  ПаспНом ,  ФамилияИО

 INTO тблВОДИТЕЛИ_Арх1

     FROM тблВОДИТЕЛИ_Арх

DROP TABLE тблВОДИТЕЛИ_Арх

GO

Вопросы для самопроверки

1. Как выглядит оператор SQL, с помощью которого можно занести одну строку в таблицу?

2. Всегда ли нужно при вводе значений указывать все имена полей в операторе INSERT? Если нет, то почему? Приведите примеры.

3. Как показать в операторе INSERT, что значение поля при вводе должно быть неопределённым?

4. Каким образом разрешить серверу внести значение поля, предусмотренное ограничителем DEFAULT?

5. Как вводятся значения даты?

6. Как установить нужный формат для представления даты?

7. Можно ли ввести в таблицу несколько строк одним оператором INSERT?

8. Как создать копию структуры таблицы, используя SELECT?

9.Можно ли внести в таблицу вычисляемое значение поля? Если да, то приведите примеры.

10. Как ввести данные в таблицу, используя Object Browser?

***

2.2. Исправление данных

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

UPDATE ИмяТаблицы 

SET И1=Зн1, И2=Зн2,…, Иk=Знk

-- Может быть  k=1

WHERE условие  

--Может отсутствовать

Здесь  И1 , И2 ,  … , Иk – имена изменяемых полей,

Зн1 , Зн2 , , Знk – новые значения соответствующих полей,

условиеэто операция сравнения, в которой могут использоваться вложенные операторы SELECT.

Оператор UPDATE, как видим, - очень мощный оператор. Прежде, чем рассмотреть примеры, сделаем несколько замечаний.

Замечание 1. Разумеется, если надо исправить одну строку таблицы, проще это сделать «вручную», высветив таблицу в Object Browser. Применять UPDATE уместно, когда желательно иметь протокол выполненного изменения или когда нужно сделать масштабную корректировку во многих строках таблицы, а также при создании процедур для автоматизации некоторых пользовательских операций. 

Замечание 2. Для исправления только одного поля предложение SET выглядит проще: SET И=Зн. 

Замечание 3. Новые значения полей могут быть представлены:

  1.  символом NULL (без апострофов!),
  2.  константой,
  3.  именем поля этой или других таблиц,
  4.  встроенной функцией,
  5.  выражением, в котором перечисленные выше элементы b,c,d  являются операндами,
  6.  оператором SELECT во всём своём богатстве.

Замечание 4. Условие, которое пишется после WHERE, может быть довольно сложным выражением, использующим, например, вложенные запросы.

Замечание 5. Предложение WHERE условие показывает, в какой строке или строках выполняется корректировка. Если это предложение опустить, изменение произойдёт во всех строках таблицы. 

Рассмотрим несколько простых примеров.

Пример 2.5. В таблице тблМАРКА для «Газели-бортовой» (НомМарки = 3) в поле Высота(м) вместо NULL (см. рис.9) занести 1,5.

Решение получится выполнением оператора

UPDATE тблМАРКА

  SET [Высота(м)] = 1.5

  WHERE НомМарки = 3

Пример 2.6. У братьев Буйновых Б.Б. дату рождения 23.02.75 в таблице тблВОДИТЕЛИ уменьшить на 20 дней и удалить сведения об автомобилях, на которых они ездили.

Для операции над датой потребуется функция

DATEDIFF (ЕдИзм, Вычитаемое, Уменьшаемое).

Здесь ЕдИзм{d, m, yy} – символ (пишется без апострофов), обозначающий единицу измерения 2-го аргумента: день, месяц или год, соответственно,

     Вычитаемое – количество дней, месяцев или лет, которое надо вычесть из 3-го аргумента,

     Уменьшаемое – исходная дата (константа, переменная или имя поля).

В нашем примере предложение SET с функцией DateDiff примет вид:

Set  ДатаРожд = DateDiff ( d, 20 , ДатаРожд).

Оператор UPDATE применим к тблВОДИТЕЛИ. Результат его работы можно увидеть на рис. 6. Начальное состояние таблицы показано в правом верхнем углу рисунка. Оно получено с помощью команды Open, выполненной в Оbject Browser. После выполнения UPDATE таблица выводится оператором SELECT на вкладку Grids области Results (нижняя таблица рисунка).

Рис. 6. Изменение полей сразу в нескольких строках таблицы 

Вопросы для самопроверки

1. Как можно исправить значение некоторого поля в таблице с помощью SQL?

2. Можно ли исправить значения нескольких полей в одной записи таблицы при использовании UPDATE?

3. Как изменить с помощью UPDATE несколько записей в таблице?

4. Какие изменения произойдут в таблице, если не указать в операторе UPDATE предложение WHERE условие?

5. Как внести оператором UPDATE поправки в несколько записей таблицы?

6. Можно ли вносить изменения в таблицу, не пользуясь оператором UPDATE?

***

2.3. Удаление данных

Удаление одной или нескольких строк делается оператором DELETE, который в общем случае имеет вид

DELETE FROM ИмяТаблицы

WHERE условие

Этот оператор сравнительно прост, но пользоваться им надо осторожно, чтобы по ошибке не стереть нужную информацию в таблице или даже всю таблицу.

Перед удалением данных имеет смысл некоторые из них сохранять в соответствующей архивной таблице по следующим причинам. Во-первых, вы можете ошибочно удалить не то, что нужно. И тогда без особого труда сможете снова переписать из архивной таблицы в оперативную то, что было удалено. Во-вторых, удалённые сведения могут понадобиться заказчику для последующего анализа. Например, некоторые водители уволились, но сведения о них, об их поездках нужно будет учитывать при подведении итогов за месяц или другой период. Это легко будет впоследствии сделать, если объединить19 архивную таблицу с текущей, и итоговые данные получать на основе этой объединённой таблицы.

Замечание 1 о целесообразности применения оператора DELETE аналогично замечанию 1, сделанному для UPDATE.

Замечание 2. Условие, которое пишется после WHERE, может быть довольно сложным выражением, использующим, например, вложенные запросы. 

Замечание 3. Предложение WHERE условие показывает, какую одну строку или несколько строк надо удалить. Если это предложение опустить, удалятся все строки таблицы. И этот факт используется, когда хочется «почистить» таблицу20.

Пример 2.7. Удалить сведения о водителях, которые ездят на автомобилях грузоподъёмностью свыше 10 т. Перед удалением перенести эти данные в архивную таблицу тблВОДИТЕЛИ_Арх (считается, что эта таблица уже объявлена).

Решение даётся следующими пакетами (цифры в комментариях слева даны для ссылок на операторы при пояснениях).

  -- Перенос данных в архивную таблицу

INSERT INTO тблВОДИТЕЛИ_Арх

SELECT *  FROM тблВОДИТЕЛИ

 WHERE    РегНомАвт IN

/* 1 */    ( SELECT НомАвто       

/* 2 */        FROM тблАВТО  A , тблМАРКА  M

/* 3 */             WHERE   ( M. [Груз(т) ] > 10 )

/* 4 */                   and ( A.НомМарки = M.НомМарки )

            )

Go

-- Удаление данных из оперативной таблицы

DELETE  FROM тблВОДИТЕЛИ

WHERE    РегНомАвт IN 

           ( SELECT РегНомАвт  

                  FROM  тблВОДИТЕЛИ_Арх  

            )

GO

SELECT * FROM  тблВОДИТЕЛИ   -- Для проверки

Пояснения. 1) Пример демонстрирует применение вложенного запроса в операторах INSERT и DELETE;

2) оператор SELECT /* 1 */ ищет регистрационные номера автомобилей грузоподъёмностью более 10 тонн /* 3 */ в декартовом произведении таблиц тблАВТО и тблМАРКА /* 2 */;

3) в предложении FROM назначаются /* 2 */ так называемые синонимы: A - для тблАВТО, M - для тблМАРКА;

4) в предложении WHERE /* 3, 4 */ эти синонимы используются21 для показа того, из каких таблиц берутся поля;

5) в операторе DELETE подзапрос SELECT извлекает требуемые регистрационные номера уже из архивной таблицы, так что декартово произведение не используется, и это позволяет сократить время выполнения поставленной задачи.

Пример 2.8. Почистить архивную таблицу тблМАРКА_Арх и вывести сообщение о выполненном действии на вкладку Grids области Results.

Задание и проверка выполняются следующими операторами:

DELETE FROM тблМАРКА_Арх

IF ( SELECT count (*) FROM тблМАРКА_Арх ) = 0

     SELECT ' *** Таблица тблМАРКА_Арх очищена *** '

Пример 2.9. Удалить из таблицы тблАВТО сведения об автомобиле с номером д-555-дд.

Решение:

INSERT INTO тблАВТО_Арх

SELECT *  FROM тблАВТО WHERE  НомАвто= 'д-555-дд'    

DELETE  FROM тблАВТО

     WHERE  НомАвто= 'д-555-дд'    

SELECT * FROM тблАВТО  -- Для проверки

Вопросы для самопроверки

1. Когда имеет смысл применять оператор DELETE?

2. Как использовать Обозреватель объектов для удаления записей в таблице?

3. Чем действие оператора DELETE отличается от действия оператора DROP?

4. Можно ли в операторе DELETE не указывать предложение WHERE?

5. Как из одной таблицы удалить записи в зависимости от данных другой таблицы?

***

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

3. Изменения в описании таблицы

Для этих целей используется оператор ALTER TABLE. В нём указывается название таблицы, а затем уточняется, во-первых, что желательно сделать: добавить (ADD) или стереть (DROP), и, во-вторых, с чем имеем дело: с полем (COLUMN) или с ограничителем (СONSTRAINT). Можно также исправлять и тип поля.

Рассмотрим, как в описание таблицы добавляются (удаляются) поля и различные ограничители полей: первичный и внешний ключи, значение по умолчанию и т.п.

3.1. Добавление поля 

Для добавления поля, как и в операторе CREATE TABLE, надо указать имя поля и тип величины, которую это поле будет представлять. Можно также снабдить это поле ограничителем Identity или Default  – в CREATE TABLE они задаются на уровне поля. Если таблица уже загружена и добавленному полю не приписано свойство Identity, все строки этого поля примут значение  Null. Ограничитель Default проявится только при вводе новых строк в таблицу.

Пример 3.1. Администратор базы данных заметил, что в таблице тблМАРКА забыл объявить поле Объём(кубм). Исправить эту оплошность поможет оператор

ALTER TABLE тблМАРКА

ADD [Объём(кубм)]  DECIMAL(4,1)

Теперь администратору БД останется только внести соответствующие значения этого поля во все уже заполненные строки с помощью оператора UPDATE или вручную.

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

Пример 3.2. В отделе кадров автопарка вспомнили, что принятому на работу водителю присваивается табельный номер (8 символов) – он фигурирует в путевом листе. И администратор базы данных решил, корректируя структуру таблицы тблВОДИТЕЛИ, кроме поля ТабНом добавить поле НомВодит. Оно будет представлять номер водителя, и нумерация будет вестись с шагом 1 автоматически, начиная с 100. Это поле потом будет объявлено ключевым вместо ПаспНом.

Изменение структуры таблицы, а также заполнение новых полей выполняется оператором, показанным на рис.7.

Рис.7. Добавление полей в описание таблицы и

изменение типа поля 

В результате поле ТабНомер получит NULL-значение в тех строках, которые уже были заполнены, а поле НомВодит в 1-й строке станет равным 100, во 2-й строке – 101 и т.д.

3.2. Изменение типа поля

Может возникнуть потребность исправить тип объявленного поля. Для внесения такой поправки оператору ALTER TABLE придают следующий вид:

ALTER TABLE ИмяТаблицы

ALTER COLUMN  ИмяПоля  ТипПоля

Пример 3.3. Вы, вероятно, обратили внимание, что в примере 3.2 заказчик определил для табельного номера 8 байтов, а администратор БД, написав CHAR(10), установил размер соответствующего поля ТабНом 10 байтов. Эту ошибку администратор исправит следующим SQL-оператором: 

ALTER TABLE тблВОДИТЕЛИ

ALTER COLUMN ТабНомер CHAR(8) 

 

Проверить это решение он может либо встроенной процедурой sp_help, либо посмотрев в Обозревателе объектов описание полей таблицы тблВОДИТЕЛИ (см. рис.7).

3.3. Удаление полей и ограничителей 

Операторы удаления поля и ограничителя очень похожи по структуре, отличаясь лишь последней строкой, смысл которой – подсказать серверу, что именно надо удалять:

ALTER TABLE ИмяТаблицы

DROP

COLUMN ИмяПоля1

              , ИмяПоля2

CONSTRAINT ИмяОграничителя1 

                     , ИмяОграничителя2

Замечание 1. Удалять можно сразу несколько полей или ограничителей. В таком случае имена этих объектов надо отделять запятыми. В вышеприведённом шаблоне показан оператор для удаления всего только двух полей и ограничителей.

Замечание 2. Перед удалением поля (COLUMN) нужно освободить его от всех связей с другими объектами. Например, от ограничителей первичного или внешнего ключа. 

Замечание 3. Информацию об ограничителях для полей данной таблицы можно получить двумя способами (см. п.1.2):

- оператором EXEC sp_HelpConstraint ИмяТаблицы,

- открыв в Object Browser для данной таблицы папку Constraint.

Пример 3.4. Администратор базы данных решил, что в таблице тблВОДИТЕЛИ поле ПаспНом может быть удалено, поскольку роль ключевого поля предполагается передать полю НомВодит. Однако неудачей окончилась попытка сделать это удаление оператором

ALTER TABLE тблВОДИТЕЛИ

DROP COLUMN ПаспНом ,

поскольку на ПаспНом ссылается ограничитель PK_тблВОДИТ_Пасп22. Значит, перед удалением поля ПаспНом требуется удалить этот ограничитель.

Пример 3.5. Удалить ограничители первичного и внешнего ключей, установленные в таблице тблВОДИТЕЛИ. Проверить вводом двух строк, перестало ли быть первичным ключом поле ПаспНом. Затем удалить поля ПаспНом и РегНомАвт посредством SQL.

Выполнить это задание можно пакетами, показанными на рис. 8.

Рис.8. Удаление ограничителей и полей

Вопросы для самопроверки

1. Можно ли добавить новое поле в структуру таблицы, используя Обозреватель объектов?

2. Как добавить в структуру таблицы несколько полей?

3. Как удалить из структуры таблицы некоторое поле?

4. Почему иногда не удаётся удалить поле из структуры таблицы?

5. Каким оператором SQL изменяют тип поля?

6. Как проверить, действительно ли изменился тип заданного поля?

7. Каким оператором SQL можно удалить ограничитель, приписанный некоторому полю?

***

3.4. Добавление ограничителей 

Мы рассмотрели ранее случаи, когда ограничители задаются при объявлении таблицы. Такой стиль хорош, когда все условия, касающиеся и таблиц, и ограничителей, обговорены с заказчиком, и есть уверенность, что они не изменятся. А если и появляются поправки, то их немного. По крайней мере, разработчики на это надеются (оптимисты).

Некоторые разработчики (пессимисты) придерживаются другого стиля. Они определяют таблицы без тех ограничителей, которые могут быть указаны на уровне таблицы, а затем все эти ограничители описывают отдельным блоком, используя ALTER TABLE. Программа-сценарий при этом, конечно, немного увеличивается, но в качестве достоинства такого стиля указывают именно на наличие отдельного блока: при необходимости его можно легко найти и увидеть все поправки, которые вносились23.

Независимо от того, к какому лагерю (оптимистов или пессимистов) вы примкнёте, вам надо знать, что ограничители добавляются к уже существующему описанию таблицы оператором вида:

ALTER TABLE ИмяТаблицы

   ADD   CONSTRAINT ОписаниеОграничителя1

           , CONSTRAINT ОписаниеОграничителя2

Замечание 1. Здесь ОписаниеОграничителя то же, что и при задании в CREATE TABLE ограничителя на уровне таблицы (см. п. 1.3). Отсюда следует, что ограничитель IDENTITY таким образом добавлять нельзя.

Замечание 2. С помощью одного оператора ALTER TABLE можно задать несколько ограничителей24. 

Замечание 3. Сервер перед добавлением ограничителя станет проверять все имеющиеся в таблице данные на соответствие введённым условиям. Если хотя бы в одной строке он обнаружит несоответствие, ограничитель не будет вставлен в описание таблицы. Однако такую проверку можно заблокировать (см. п. 3.4.3).

Рассмотрим типичные примеры. Начнём с ограничителей, обеспечивающих целостность таблицы и целостность ссылок.

3.4.1. Добавление PRIMARY KEY и  FOREIGN KEY

Пример 3.6. Добавить в таблицу тблВОДИТЕЛИ описания первичного ключа для поля НомВодит и внешнего ключа для поля РегНомАвт. Внешний ключ должен ссылаться на поле НомАвто таблицы тблАВТО.

Это исправление выполняется следующим оператором (сравните его с оператором CREATE TABLE  в примере 1.5 раздела 1.4):

ALTER TABLE тблВОДИТЕЛИ

  ADD CONSTRAINT PK_тблВОДИТ_НомВодит

                                PRIMARY KEY  (НомВодит)

          ,CONSTRAINT FK_тблВОДИТ_РегНом

                               FOREIGN KEY (РегНомАвт)

                               REFERENCES тблАВТО (НомАвто)

GO

3.4.2. Добавление DEFAULT-ограничителей

В этом случае ОписаниеОграничителя (см.п. 3.4) оператора ALTER TABLE перед именем поля должно содержать служебное слово FOR.

Пример 3.7. Добавить в таблицу тблМАРКА описание DEFAULT-ограничителей для полей Ширина(м) и  Длина(м).

Это изменение в определении таблицы вносится оператором 

ALTER TABLE тблМАРКА

ADD CONSTRAINT DF_тблМарка_Шир 

                        DEFAULT 2.2  FOR   [Ширина(м)]

       ,CONSTRAINT DF_тблМарка_Длн

                        DEFAULT 3.2  FOR  [Длина(м)]

GO

3.4.3. Добавление ограничителей без проверки данных

Допустим, таблица уже загружена данными, а заказчик предлагает добавить ограничитель для какого-либо поля. Известно, что имеющиеся в таблице данные проверяются на соответствие введённым условиям. Но как предотвратить затраты машинного времени и блокировать такую проверку со стороны сервера, если администратор БД уверен, что все данные в таблице удовлетворяют условиям ограничителя? Или решил, что ограничитель должен действовать лишь на вновь вводимые данные, а старые оставить без проверки?

Такая возможность имеется, но лишь для ограничителей FOREIGN KEY и CHECK. Чтобы ею воспользоваться, надо в операторе ALTER TABLE после имени таблицы написать два слова - WITH NOCHECK.

Рассмотрим, как это сделать для таблицы тблВОДИТЕЛИ.

Пример 3.8. В примере 1.8 (см. п. 1.5.3) была предусмотрена проверка: возраст водителя должен быть более 18 лет. По распоряжению начальника отдела кадров требуется ввести новое ограничение: возраст вновь принимаемых водителей должен находиться в диапазоне от 25 до 45 лет включительно. 

Чтобы удовлетворить указания заказчика, Администратор БД выполнил следующий пакет операторов:

-- Проверка наличия ограничителя

IF (SELECT name FROM sysobjects

              WHERE name = 'CH_тблВОДИТ_ДатаРожд'  

                                         and type='C' )  IS NOT NULL

BEGIN -- Если ограничитель есть, он удаляется

   ALTER TABLE тблВОДИТЕЛИ

                DROP CONSTRAINT CH_тблВОДИТ_ДатаРожд

       PRINT '  ****  Удалён  CH_тблВОДИТ_ДатаРожд **** '

  END

-- Добавление ограничителя без проверки данных

ALTER TABLE тблВОДИТЕЛИ  WITH NOCHECK

   ADD CONSTRAINT  CH_тблВОДИТ_ДатаРожд

   CHECK (Year( GetDate())-Year(ДатаРожд) between 25 and 45 )

GO

Администратор БД убедился, что в таблице строка об Арканове А.А. (см. рис. 8), не удовлетворяющая поставленному условию, - этому водителю в 2011 году исполнилось 22 года, - не помешала ввести данный ограничитель. Чтобы проверить действие ограничителя при вводе новых данных, администратор БД попытался добавить строку о 46-летнем человеке с датой рождения 26.06.1964 и прочитал причину отказа, подобную той, что показана на рис. 3.

Пример 3.9. Обеспечить ввод в таблицу тблАВТО новых данных так, чтобы ключевое поле НомАвто имело вид Б-ЦЦЦ-ББ, где Б – буква латинского или русского алфавита, а Ц – арабская цифра, причём недопустимо смешивание этих алфавитов (например, нельзя ФG).

Решение. Администратор базы данных решил воспользоваться

так называемой маской25 (см таблицу 2),показывая в ограничителе CHECK вместе со служебным словом LIKE диапазоны изменения

цифр [0-9], кириллицы [а-я] и латиницы [a-z]. Ниже приведён сценарий, в который включены также (для проверки) операторы вставки новых строк и их удаления.

Таблица 2

Символы маски, используемые в SQL

Символ 

Что обозначает

%

Любое количество (0 или более) любых символов

 _ (подчерк)

Любой единственный символ

[список]

Любой символ в одном или нескольких заданных диапазонах (например, [a-fп-т] ) или наборе (например, [опст] )

[^список]

Любой символ вне заданных одного или нескольких диапазонов (например, [^п-ф] ) или набора (например, [^aef] )

IF (SELECT COUNT(name) FROM sysobjects

       WHERE name = 'CH_тблАВТО_НомАвто' and type='C' ) > 0

   ALTER TABLE тблАВТО 

          DROP CONSTRAINT CH_тблАВТО_НомАвто

go

ALTER TABLE тблАВТО WITH NOCHECK

      ADD  CONSTRAINT CH_тблАВТО_НомАвто

          CHECK ( НомАвто LIKE '[а-я]-[0-9][0-9][0-9]-[а-я][а-я]'

                                        OR

                         НомАвто LIKE '[a-z]-[0-9][0-9][0-9]-[a-z][a-z]'

                        )

EXEC sp_helpConstraint тблАВТО

GO --  Проверка действия ограничителя.

INSERT INTO  тблАВТО  

   VALUES ('R-666-дд' ,5) -- НЕ ввелась: латиница с кириллицей!

INSERT INTO  тблАВТО  

   VALUES ('я-7ж7-яя', 5) --НЕ ввелась: среди цифр оказалась буква!

INSERT INTO  тблАВТО  

   VALUES ('R-555-st',5)    -- Ввелась: удовлетворяет условию…

INSERT INTO  тблАВТО  

   VALUES ('я-777-яя', 5)        –- Ввелась: удовлетворяет условию…

SELECT * FROM тблАВТО  

DELETE FROM тблАВТО        –- Удаление введённых строк

   WHERE  НомМарки = 5

GO 

***

Мы рассмотрели случай, который можно условно назвать «данные старые – ограничители новые». Теперь поменяем местами слова «данные» и «ограничители» и познакомимся с ситуацией «ограничители старые - данные новые».

3.4.4. Добавление данных без проверки ограничителей 

Допустим, что ограничители FOREIGN KEY и CHECK уже установлены для некоторой таблицы. И требуется в неё загрузить большой объём данных, которые удовлетворяют этим ограничениям, так что если блокировать работу ограничителей, можно неплохо сэкономить машинное время.

Возможна и другая ситуация, когда имеет смысл отключить ограничители: заранее известно, что вводимые данные не удовлетворяют ограничениям, но предполагается, что эти данные будут подправлены, и тогда ограничители снова могут быть включены. Сервер предоставляет такую услугу.

Отключение ограничителя делается оператором

ALTER TABLE ИмяТаблицы

        NOCHECK   CONSTRAINT ИмяОграничителя

Повторное включение ограничителя выполняет оператор

ALTER TABLE ИмяТаблицы

            CHECK   CONSTRAINT ИмяОграничителя

Замечание 1. Одним оператором можно отключать (включать) сразу несколько ограничителей. В этом случае их имена перечисляются одно за другим через запятую.

Замечание 2. Состояние ограничителя можно узнать посредством процедуры sp_helpConstraint. Если ограничитель включён, то в таблице, которая выводится в результате срабатывания процедуры, поле status-enabled имеет значение Enabled. Если выключен, то status-enabled = Disabled26 

Пример 3.10. Известно, что в таблице тблАВТО имеются ограничители CH_тблАВТО_НомАвто (см. пример 3.9.) и FK_тблАВТО_НомМарки (см. пример 1.6). Требуется отключить их и ввести строки, нарушающие установленные ограничения, а затем снова включить и проверить вводом правильных данных.

Решение. Оператор, блокирующий эти два ограничителя, показан на рис. 9. В нижней таблице - результат работы процедуры sp_helpConstraint, в её столбце status-enabled для указанных ограничителей значится Disabled. В правом верхнем углу высвечено текущее состояние таблицы тблАВТО. 

Для проверки блокирования ограничителей введём две строки, которые нарушают условия обоих ограничителей. На рис.10 показана таблица тблАВТО после команд ввода (сравните её с той, что на рис. 9): строки благополучно занеслись в таблицу !


Рис.9. Отключение ограничителей и просмотр их статуса

Рис.10. Ввод данных при отключенных ограничителях


Можно убедиться  и в том, что в
тблАВТО отключена проверка целостности ссылок: внешний ключ НомМарки=99 не соответствует ни одному значению НомМарки в тблМАРКА (эта таблица также высвечена на рис. 10 внизу справа).

После такого ввода снова включим ограничители:

ALTER TABLE тблАВТО

       CHECK CONSTRAINT CH_тблАВТО_НомАвто,

                                            FK_тблАВТО_НомМарки

Теперь попытка ввести строку с нарушением какого-либо из указанных ограничений вызовет раздражение сервера, и строка введена не будет!

Вопросы для самопроверки

1. Какого стиля (оптимистов или пессимистов) вы придерживаетесь при добавлении ограничителей в уже существующее описание таблицы? Объясните свой выбор.

2. Справедливо ли мнение, что наличие ограничителей замедляет загрузку данных в таблицу?

3. Когда имеет смысл запретить действие ограничителей?

4. Для каких ограничителей и как можно блокировать их действие?

5. Как добавить в описание таблицы ограничитель первичного ключа и/или внешнего ключа?

6. Как добавить в заполненную таблицу для некоторого поля ограничители DEFAULT, NULL, NOT NULL?

7. Как можно отключить и снова включить ограничитель?

8. Как узнать без ввода данных, включен или отключен ограничитель?

9. Можно ли одним оператором отключать (включать) сразу несколько ограничителей?

***

4. Упражнения

4.1. Разработайте концептуальную и логическую модели предметной области

  1.  Обсудите и выберите предметную область, для которой вы будете разрабатывать базу данных.
  2.  Разработайте концептуальную модель для выбранной предметной области и зафиксируйте её в виде ER-диаграммы.
  3.  Разработайте логическую модель предметной области и скорректируйте ER-диаграмму, освободив её от связей «многие-ко-многим», указав типы атрибутов для каждой сущности и связей. Обратите внимание на рекурсивные связи и связи «тип – супертип».
  4.   Задайте базу данных так, чтобы сервер присвоил её файлам стандартные значения параметров. Имя БД присваивается по прежнему соглашению, но в нём вместо фамилии следует отразить  предметная область (например, М_40901_Б_Агрофирма)

Указания для выполнения этого и следующих упражнений:

1) При выборе предметной области можно ориентироваться на перечень, показанный в брошюре [2].

2) Для выполнения этого и последующих упражнений в группе желательно выбрать Администратора базы данных (АБД) и его заместителя.

3) АБД задаёт базу данных.

4) АБД распределяет подгруппу на бригады по 1-2 человека и поручает каждой бригаде сферу ответственности для информационного сопровождения конкретных задач предметной области. Например, для сельскохозяйственной фирмы сферами ответственности могут быть её работники, животноводческие помещения, крупный рогатый скот и другие животные и птицы, склады, техника, поля для зерновых и других культур и т.п.

5) АБД тоже входит в одну из бригад.

6) АБД с участием бригадиров разрабатывает логическую модель, а затем, если требуется, вносит в неё изменения по мере выполнения бригадами упражнений и решения задач, диктуемых предметной областью.

Следующие упражнения выполняются каждой бригадой в соответствии со своей сферой ответственности.

4.2. Объявите и загрузите таблицы с помощью Enterprise Manager

  1.  Разработайте по ER-диаграмме базы данных свои реляционные таблицы, фиксируя на бумаге их структуру с учётом сущностей и связей между ними,
  2.  Проверьте эти таблицы на отсутствие аномалий, т.е. будут ли они в 3-й нормальной форме,
  3.  Задайте с помощью Enterprise Manager структуру одной таблицы так, чтобы в неё вошли не более трёх полей. Присваивая имя таблице, не забудьте про префикс.
  4.  Занесите в объявленную таблицу 2–3 записи.
  5.  Добавьте одно поле в структуру таблицы.
  6.  Внесите данные в строки, соответствующие добавленному полю.
  7.  Прочитайте все данные, занесённые в таблицу.

4.3. Объявите и загрузите таблицы с помощью Query Analyzer

  1.  Вызовите Query Analyzer и, если надо, сделайте видимым Обозреватель объектов.
  2.  Выведите на экран содержимое созданной в Enterprise Manager таблицы, во-первых, с помощью Обозревателя объектов и, во-вторых, оператором SELECT.
  3.  Посмотрите в Обозревателя объектов содержимое таблицы SysObjects и найдите в ней имя зарегистрированной там Вашей таблицы.
  4.  Снова объявите таблицу (ту же самую или другую) оператором CREATE, причём не забудьте:

а) перед оператором объявления таблицы написать команды проверки, существует ли таблица, и удалить таблицу, если она существует,

б) объявить ключевое поле (на уровне таблицы), может быть, с ограничителем IDENTITY.

  1.  Добавьте в таблицу несколько записей, пользуясь Обозревателем объектов. 
  2.  Добавьте с помощью SQL в описание таблицы для некоторых полей ограничители DEFAULT, NULL, NOT NULL, CHECK, FOREIGN KEY.
  3.  Добавьте в таблицу несколько строк операторами INSERT. Убедитесь, что можно менять порядок перечисления имён полей, а также не указывать имена тех полей, которым приписаны ограничители IDENTITY, DEFAULT, NULL. Обратите внимание на ввод даты и NULL-значений.
  4.  Проверьте соблюдение условий целостности таблиц и связей.
  5.  Вставьте в таблицу несколько строк, извлечённых из другой таблицы по заданному условию.

4.4. Внесите изменения в таблицы с помощью Query Analyzer

  1.  Напишите оператор, который изменяет тип некоторого поля. Проверьте действие этого оператора.
  2.  Создайте с помощью SELECT копию таблицы (назовём её архивной) перед изменениями этой таблицы.
  3.  Напишите и поверьте работу оператора, изменяющего значение одного поля в заданной строке таблицы (например, увеличить цену заданного продукта на какое-то количество процентов) и проверьте его работу.
  4.  Продемонстрируйте умение при задании условий выборки использовать символы маски {%, _, […], [^…] }.
  5.  Напишите оператор, изменяющий значение одного поля в нескольких строках таблицы по условию, заданному для другой таблицы (например, снизить цену на какую-то сумму у всех продуктов, поставляемых позже  определённой даты фирмами, название которых начинается буквой П). Проверьте работу этого оператора.
  6.  Напишите оператор, удаляющий одну строку таблицы (например, удалить сведения о некотором работнике). Не эабудьте перед удалением строки перенести её в архивную таблицу (это напоминание относится также и к следующим ниже заданиям на удаление строк).
  7.  Напишите оператор, демонстрирующий каскадное удаление строк таблицы.
  8.  Напишите оператор удаления из таблицы нескольких строк, удовлетворяющих заданному условию (например, удалить товары с просроченной датой).
  9.  Продемонстрируйте умение добавить в описание таблицы ограничитель к полю, чтобы сервер реагировал только на вновь вводимые данные.
  10.   Продемонстрируйте умение отключать и включать действие ограничителя при вводе данных.

****

Заключение

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

Было показано, как задавать к определённым полям таблицы различные ограничители (PRIMARY KEY, FOREIGN KEY, NULL, NOT NULL, IDENTITY, DEFAULT, CHECK), а также как удалять их из описания таблицы. Подчёркивалось, что ограничители можно задавать не только в момент определения таблицы оператором CREATE TABLE, но и позднее, даже после того, как в таблицу были внесены данные.

Мы рассказали, как вводить данные в таблицу оператором INSERT, показали взаимодействие этого оператора с оператором выборки SELECT, позволяющее загружать данные в некоторую таблицу из других таблиц. Научили применять операторы UPDATE и DELETE для модификации и удаления данных из существующих таблиц. Эти операторы иногда называют поисковыми, так как в них могут быть включены условия изменения или удаления многих строк таблицы. Этот факт требует от пользователя особой бдительности, и мы рекомендовали использовать «архивные» таблицы перед внесением изменений в существующие данные.

Теперь пользователь готов использовать всю мощь T-SQL для решения задач Заказчика, создавая запросы и сохраняя результат их действия в виде так называемых псевдотаблиц, готов разрабатывать процедуры, триггеры и курсоры.

Литература

1. Товштейн М.Я. Работа “клиента” с удалённой базой данных. Часть 1. Задание базы данных и её таблиц утилитой MS SQL Enterprise Manager: учебное пособие/ М.Я. Товштейн; филиал Казанского гос. университета. – Набережные Челны: Лаб. операт. полиграфии, 2010.

2. Товштейн М.Я. Работа «клиента» с удалённой базой данных. Часть 2. MS SQL Query Analyzer, T-SQL и задание базы данных: учебное пособие/ М.Я. Товштейн; фил. Казанского федерального ун-та. – Набережные Челны: Лаб. операт. полиграфии, 2011.

3. Кузнецов С.Д. Базы данных: языки и модели. Учебник – М.: ООО «Бином-Пресс», 2008.

4. Ульман Л. MySQL. Руководство по изучению языка. – М.: ДМК Пресс; СПб.: Питер, 2004.

1 Стирание таблицы следует отличать от удаления таблицы (см. п. 2.3). Удаление таблицы подразумевает стирание всех занесённых в неё данных при сохранении описания структуры.

2 Error – ошибка. Функция @@ERROR , как вы поняли, применима после любого оператора SQL, а не только после DROP.

3 Заметим, однако, что структура таблиц может быть впоследствии изменена (разумеется, по желанию заказчика).

4 Primary –первичный, foreign – иностранный,  key – ключ.

5 Напомним, что на ER-диаграмме родительской таблице соответствует сущность на стороне «один» стрелки, а дочерней таблице – сущность на стороне «много» стрелки.

6 Constraint –  ограничение. О том, как добавить ограничитель к уже существующему объявлению таблицы, см. п. 3.4.

7 Мы будем пользоваться преимущественно этим вариантом.

8 Для вашего примера числовая компонента имени будет другой, ибо формируется она датчиком случайных чисел.

9 Первые буквы от PRIMARY KEY.

10 to reference – ссылаться.

11 Например, взамен потерянного паспорта получен новый.

12 On delete cascade - для каскадного удаления,


 on update cascade - для каскадного исправления.

13 Вспомните автоматически появлявшуюся «птичку» в столбце Allow Nulls при задании структуры таблицы в Enterprise Manager.

14 Identity – это ID entity, т.е. идентификационный номер сущности, to seed – засевать, increment – приращение.

15 Строго говоря, задание значения по умолчанию нельзя назвать ограничителем, т.к. это свойство не ограничивает (не проверяет) вводимые данные, а только определяет, что может случиться, если пользователь значение не введёт.

16 Здесь можно применить не две, а одну функцию DateDiff (см. пример 2.5 в разделе 2.2). Список и описание встроенных функций, работающих с датой и временем, можно посмотреть в Оbject Browser, раскрыв последовательно папки Common Objects и Date and Time Functions. В папке Common Objects  содержатся также описания математических, итоговых (агрегатных), строковых и других функций.

17 Далее можно было бы рассказать о том, как изменять структуру таблицы. И это было бы логично, т.к. продолжалось бы знакомство с оператором ALTER TABLE, входящим наряду с CREATE TABLE  в группу DDL. Однако, исходя из логики ведения занятий в вузе, лучше вначале научиться заполнять таблицу с помощью группы DML, чтобы потом применять эти знания для проверки изменений, вносимых в таблицу оператором ALTER TABLE.

18 Кроме такого, формат может быть mdy, ymd, ydm, myd, dym. Стандартным (по умолчанию) принят американский формат – mdy.

19 Использовать для этого оператор UNION

20 В отличие от действия оператора DROP, при таком удалении сохраняется описание структуры таблицы.

21 Напомним, что применение синонимов имён таблиц позволяет сократить запись оператора в целом (например, вместо тблАВТО.НомМарки пишем А.НомМарки).

22 Вот какое сообщение выдал сервер:


«The object 'PK_тблВОДИТ_Пасп'  is dependent on column 'ПаспНом'. ALTER TABLE DROP COLUMN ПаспНом failed because one or more objects access this column».

23 Часть из них «замораживается» знаками комментария (/*, */) и датируется. Документ - так документ!

24 Здесь условно показано добавление только двух ограничителей.

25. Напомним: маска – это формат, состоящий из постоянных символов (таких как скобки, точки или дефисы) и специальных символов, указывающих, в какие позиции, в каком количестве и какого типа данные могут быть введены. Наряду с термином маска используются также термины шаблон , образец.

26 To enable – позволять, enabled - разблокированный. To disable – блокировать, выводить из строя, disabled -  нетрудоспособный.


 

А также другие работы, которые могут Вас заинтересовать

75409. Вводные слова и основания для их выделения в особую часть речи 29 KB
  Вводные слова и основания для их выделения в особую часть речи. Как особая часть речи нередко рассматриваются вводные или модальные слова. Это неизменяемые слова производные от слов иных частей речи при помощи которых выражается субъективное отношение говорящего к высказыванию или его части с точки зрения достоверности недостоверности т. Как правило эти слова выступают в синтаксической функции вводного слова: вопервых итак разумеется вернее дескать всего подобных слов около трёхсот.
75410. Проблема местоимений как особой части речи. Особенности местоименной семантики и функции местоименных слов. Основания для их разведения по разным частям речи 12.67 KB
  Термин местоимение в грамматической науке употребляется также применительно к более широкому кругу слов, чем местоимения-существительные: местоимениями называются слова – существительные, прилагательные, числительные
75411. Проблема слов «категории состояния». Их признаки и основания для выделения в особую часть речи. Понятие «предикатив» и его соотношение с «категорией состояния» 13.23 KB
  Проблема слов категории состояния. Понятие предикатив и его соотношение с категорией состояния. Категория состояния это класс слов которые обозначают независимый признак состояние душевное физическое или эмоциональное состояние человека окружающей среды и природы и не имеют форм словоизменения склонения и спряжения но могут с помощью глаголасвязки выражать значение времени. При характеристике категории состояния как части речи основная трудность связана с необходимостью отграничивать эти слова от омонимичных им форм...
75412. Наречие как часть речи. Проблема компаратива 17.62 KB
  Главным формальным признаком наречия как части речи является отсутствие словоизменения. Исключение составляют наречия образующие формы сравнительной степени. По своему общему значению непроцессуального признака наречия близки прилагательным. Этим значением определяются синтаксические функции наречий: вопервых они определяют глагол имя или другое наречие соединяясь с ним связью примыкания; вовторых наречия свободно употребляются в функции сказуемого; втретьих наречия определяют предложение в целом.
75413. Глагол как часть речи. Принципиальное отличие глагола от имени. Особенности глагольной основы. Классы глаголов 46 KB
  Глагольные спрягаемые формы чаще всего в предложении выполняют предикативную функцию. По образованию глагольные формы распадаются на две группы в зависимости от образующей основы которая может выступать в двух вариантах: как основа неопределенной формы и как основа настоящего времени. Основа неопределенной формы определяется путем устранения аффиксов ть ти: собирать.
75415. Способы глагольного действия. Их соотношение с видом 17.09 KB
  С категорией вида тесно связаны лексико-грамматические разряды глаголов называемые способами глагольного действия. Иначе говоря способы глагольного действия это такие семантико-словообразовательные группировки глаголов в основе которых лежат модификации изменения значений беспрефиксных глаголов с точки зрения временных количественных специально результативных характеристик значение начала действия может быть выражено различными префиксами: за по вз воз: заговорить пойти вскричать одноактность мигнуть Мы характеризуем какой...
75416. Оптичні давачі. Давачі дифузного типу 2.47 MB
  Давачі дифузного типу Давач дифузного типу створений за принципом давача з відбиттям від рефлектора. Давачі дифузного типу Давач дифузного типу з придушенням заднього фону Давачі дифузного типу з придушенням заднього фону були розроблені для того щоб досягти визначеного діапазону сканування для будьяких обєктів незалежно від їх яскравості кольору та інших властивостей а також від яскравості заднього фону. Такі давачі ігнорують всі обєкти які знаходяться до давача ближче ніж попередньо налаштований діапазон виявлення.
75417. Безконтактний магніточутливий давач 262 KB
  Давач що виявляє зміну напруженості постійного магнітного поля має напівпровідниковий комутуючий елемент і що не містить рухомих частин в чутливому елементі рис. Спрацювання давача відбувається при зміні напруженості магнітного поля викликаного наприклад переміщенням постійного магніту розташованого на рухомої частини механізму. Крім того магніточутливих давачи можуть відрізнятися по реакції на зміну магнітного поля: При збільшенні напруженості зовнішнього магнітного поля наприклад при наближенні постійного магніту...