Работа с MicrosoftSQLServer с использованием языка SQL в интерактивном режиме
Мы начнем с описания базы данных pubs, которая будет использоваться на практических занятиях. Эта база данных имитирует информационное хранилище издательской компании и состоит из 11 таблиц: authors (авторы), discounts (скидки), employee (служащие), jobs (задания), pub_info (информация об издательствах), publishers (издательства), roysched (авторские гонорары), sales (продажи), stores (магазины), titleauthor (название-автор), titles (названия).
Таблицы определены следующим образом:
Таблица authors
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| au_id | id | нет | нет |
| au_lname | varchar(40) | нет | нет |
| au_fname | varchar(20) | нет | нет |
| phone | char(12) | нет | 'UNKNOWN' |
| address | varchar(40) | да | нет |
| city | varchar(20) | да | нет |
| state | char(2) | да | нет |
| zip | char(5) | да | нет |
| contract | bit | нет | нет |
Первичным ключом объявлен столбец au_id. Определены два ограничения целостности на столбцах au_id (au_idLIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]') и zip (zipLIKE '[0?9][0-9][0-9][0-9][0-9]').
К типу данных id нужно относиться как к типу символьных строк (CHAR(9)). Тип varchar - аналог CHARACTERVARYINGSQL/92. Тип bit - нестандартный, и мы не будем использовать столбец contract в наших примерах.
Таблица discounts
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| discounttype | varchar(40) | нет | нет |
| stor_id | char(4) | да | нет |
| lowqty | smallint | да | нет |
| highqty | smallint | да | нет |
| discount | float | нет | нет |
Эта таблица представляет интерес тем, что в ней отсутствует первичный ключ (если внимательно посмотреть на требования стандарта SQL, то можно увидеть, что такая ситуация допускается, хотя на практике встречается очень редко). Для таблицы определено ссылочное ограничение: столбец stor_id ссылается на первичный ключ stor_id таблицы stores.
Таблица employee
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| emp_id | empid | нет | нет |
| fname | varchar(20) | нет | нет |
| minit | char(1) | да | нет |
| lname | varchar(30) | нет | нет |
| job_id | smallint | нет | 1 |
| job_lvl | tinyint | нет | 10 |
| pub_id | char(4) | нет | '9952' |
| hire_date | datetime | нет | GETDATE() |
Первичным ключом объявлен столбец emp_id. Имеются два ссылочных ограничения: столбец job_id ссылается на первичный ключ job_id таблицы jobs, столбец pub_id ссылается на первичный ключ pub_id таблицы publishers. Определено ограничение для столбца emp_id: (emp_idLIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' ORemp_idLIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'). Тем самым, видно, что тип emp_id на самом деле есть varchar(9). Тип данных tinyint является нестандартным, и мы не будем использовать столбец job_lvl. Функция GETDATE() является аналогом стандартной функции CURRENT_DATE, т.е. значением по умолчанию столбца hire_date является текущая дата.
Таблица jobs
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| job_id | smallint | нет | IDENTITY(1,1) |
| job_desc | varchar(50) | нет | 'NewPosition - titlenotformalizedyet' |
| min_lvl | tinyint | нет | нет |
| max_lvl | tinyint | нет | нет |
Первичный ключ - job_id. Значение по умолчанию этого столбца вырабатывается нестандартной функцией IDENTITY, генерирующей уникальные целые значения.
Таблица pub_info
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| pub_id | char(4) | нет | нет |
| logo | image | да | нет |
| pr_info | text | да | нет |
Первичный ключ таблицы - pub_id. Этот же столбец является и внешним ключом и ссылается на первичный ключ pub_id таблицы publishers. Типы данных image и text являются нестандартными, и мы не будем использовать столбцы logo и pr_info.
Таблица publishers
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| pub_id | char(4) | нет | нет |
| pub_name | archar(40) | да | нет |
| city | varchar(20) | да | нет |
| state | char(2) | да | нет |
| country | varchar(30) | да | 'USA' |
Первичный ключ - pub_id. Для этого столбца, кроме того, определено следующее ограничение: (pub_id = '1622' ORpub_id = '0877' ORpub_id = '0736' ORpub_id = '1389' ORpub_idLIKE '99[0-9][0-0]').
Таблица roysched
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| title_id | tid | нет | нет |
| lorange | int | да | нет |
| hirange | int | да | нет |
| royalty | int | да | нет |
В этой таблице отсутствует первичный ключ. Объявлено одно ссылочное ограничение: столбец title_id ссылается на первичный ключ title_id таблицы titles. Тип tid - синоним char(6), тип int - синоним стандартного типа INTEGER.
Таблица sales
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| stor_id | char(4) | нет | нет |
| ord_num | varchar(20) | нет | нет |
| ord_date | datetime | нет | нет |
| qty | smallint | нет | нет |
| payterms | varchar(12) | нет | нет |
| title_id | tid | нет | нет |
Первичный ключ таблицы образует комбинация полей stor_id, ord_num, title_id. Определены два внешних ключа: столбец stor_id ссылается на первичный ключ stor_id таблицы stores, а столбец title_id - на первичный ключ title_id таблицы titles.
Таблица stores
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| stor_id | char(4) | нет | нет |
| stor_name | varchar(40) | да | нет |
| stor_address | varchar(40) | да | нет |
| city | varchar(20) | да | нет |
| state | char(2) | да | нет |
| zip | char(5) | да | нет |
Первичным ключом является столбец stor_id.
Таблица titleauthor
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| au_id | id | нет | нет |
| title_id | tid | нет | нет |
| au_ord | tinyint | да | нет |
| royaltyper | int | да | нет |
Первичный ключ составляет комбинация столбцов au_id, title_id.
Таблица titles
| Имя столбца | Тип данных | Возможность содержать NULL | Значение по умолчанию |
| title_id | tid | нет | нет |
| title | varchar(80) | нет | нет |
| type | char(12) | нет | 'UNDECIDED' |
| pub_id | char(4) | да | нет |
| price | money | да | нет |
| advance | money | да | нет |
| royalty | int | да | нет |
| ytd_sales | int | да | нет |
| notes | varchar(200) | да | нет |
| pubdate | datetime | нет | GETDATE() |
Первичный ключ - title_id. Внешний ключ pub_id ссылается на первичный ключ pub_id таблицы publishers. Тип money - нестандартный, и мы не будем использовать столбцы price и advance.
Содержимое базы данных можно посмотреть в приложении B руководства по TransactSQL, входящего в оперативно доступную документацию по MicrosoftSQLServer, а также в прилагаемом тексте.
Слушатели будут работать с базой данных pubs с рабочих станций. Для каждого слушателя будет использоваться одно и то же входное имя (admin) и один и тот же пароль (adminnt). Следует учитывать, что пользователь admin обладает привилегиями администратора WindowsNT. Поэтому, чтобы не разрушить систему, слушателям не следует выполнять какие-либо действия, не предусмотренные программой занятий, без согласования с преподавателями.
Для доступа к базе данных будет использоваться программа MicrosoftQuery, позволяющая, в частности, через средства ODBC работать с MSSQLServer. Правила вызова MSQuery с обеспечением общего доступа к базе данных pubs будут продемонстрированы преподавателем.