РАЗРАБОТКА ИНТЕРНЕТ-СИСТЕМЫ СПРАВОЧНОЙ ИНФОРМАЦИИ ДЛЯ АГРОПРОМЫШЛЕННОГО КОМПЛЕКСА

 

РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ СОЦИАЛЬНЫЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕДРА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И АВТОМАТИЗИРОВАННЫХ СИСТЕМ

 

 

 

 

 

 

 

 

 

 

 

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К ДИПЛОМНОЙ РАБОТЕ

 

РАЗРАБОТКА ИНТЕРНЕТ-СИСТЕМЫ СПРАВОЧНОЙ ИНФОРМАЦИИ ДЛЯ АГРОПРОМЫШЛЕННОГО КОМПЛЕКСА

 

 

 

 

 

 

 

 

 

Студентка 5 курса

Группы ПОВТ-Д-5

Зевина Е.О.

 

Допустить к защите Научный руководитель   

д.ф.-м.н., с.н.с.,

____________________   Рубальский Г.Б.

Заведующий кафедрой

Программного обеспечения

вычислительной техники и

автоматизированных систем

 

 

 

 

 

 

Москва 2009


РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ СОЦИАЛЬНЫЙ

УНИВЕРСИТЕТ

 Факультет информационных технологий

Кафедра   Программного  обеспечения  ВТ и АС

Специальность 220400 – ПОВТ и АС

 

ЗАДАНИЕ

на дипломную работу

 

 

Студент: Зевина Екатерина Олеговна   группа ПОВТ-Д-5

 

Тема дипломного проекта  Разработка интернет-системы справочной информации для агропромышленного комплекса

 

Время выполнения проекта с  01 февраля по 25 мая 2009 г.

 

 

Руководитель дипломного проекта  д.ф.-м.н., проф. Рубальский Г.Б.    

  должность, звание, фамилия, инициалы

 

Тема дипломного проекта и руководитель утверждены приказом по факультету № ___________ от «____»_____________ 2008 г.

 

Консультант _________________________________________________

 

 

Место выполнения проекта РГСУ  

 

Руководитель проекта от предприятия (если проект выполнялся вне РГСУ)

должность, звание, фамилия, инициалы подпись   дата

 

Студент  

подпись студента   дата

 

Зав. Кафедрой

  подпись   дата

 

 

 

 

1. Содержание задания и исходные данные к проекту:

  Разработать интернет-систему Классификаторы для агропромышленного комплекса на основе технического задания.      

 

 

 

 

 

 

Подпись руководителя дипломного проекта  

 

2. Календарный график работы по разделам дипломного проекта

Выполненная работа

Дата начала

Дата окончания

Отметки о выполнении

1

Постановка задачи

01.02.2009

01.02.2009

 

2

Анализ задачи

05.02.2009

15.02.2009

 

3

Сбор материала

17.02.2009

02.03.2009

 

4

Реализация программы

03.03.2009

16.05.2009

 

5

Оформление

20.05.2009

10.06.2009

 

 

 

 

 

 

 

Составил «____»____________2009 г. ___________

  подпись студента

«Согласовано» руководитель проекта __________

  подпись   дата

 

3. Перечень графического материала

 

 

4. Рекомендуемая исходная литература

 


СОДЕРЖАНИЕ

ВВЕДЕНИЕ. 7

1.   СУБД MICROSOFT SQL SERVER 2000. 9

1.1 Общие сведения о базах данных. 9

1.2. Установка Microsoft SQL Server 2000. 10

1.3. Основные средства PHP для взаимодействия с базой данных. 13

1.4. Подключение к базе данных. 13

1.5. Передача запросов к базе данных. 15

1.6. Обработка данных в сценарии. 16

1.7. Создание базы данных. 17

1.8 Создание таблицы для хранения данных. 18

2.   ИСПОЛЬЗОВАНИЕ SQL SERVER 2000. 20

2.1 Инструменты SQL Server 2000. 20

2.1.1. Enterprise Manager 20

2.1.2. SQL Server Service Manager 21

2.1.3. SQL Server Profiler 21

2.1.4. Query Analyzer 22

2.1.5. Upgrade Wizard. 23

2.1.6. Import and Export Data. 24

2.1.7. Client Network Utility и Server Network Utility. 24

2.1.8. Утилиты командной строки. 25

2.1.9. Мастера. 26

2.2. Введение в проектирование баз данных. 26

2.2.1. Классификации баз данных. 26

2.2.2. Структурные элементы базы данных. 27

2.2.3. Модели данных. 29

2.2.4. Проектирование реляционных баз данных. 30

2.2.5. Связывание таблиц. Первичный и внешний ключи. 31

2.2.6. Типы связей между таблицами. 33

2.3. Транзакции и блокировки. 34

2.3.1. Основы транзакций. 34

2.3.2. Основы блокировок. 35

2.4. Работа с таблицами. 38

2.4.1. Проектирование таблиц. 38

2.4.2 Ограничения целостности. 38

2.4.3. Выбор типа данных. 39

2.4.5. Использование автонумерации. 40

2.5. Использование представлений. 41

2.5.1. Создание представления. 42

2.6. Индексы.. 43

2.6.1. Использование индексов. 44

2.7. Функции SQL Server 2000. 46

2.7.1. Встроенные функции. 46

2.7.2. Функции, определяемые пользователем. 47

2.8.   Вставка, удаление и изменение данных. 48

2.8.1. Добавление строк. 49

2.8.2. Изменение данных. 49

2.8.3. Удаление данных. 50

2.9.   Выборка данных. 51

2.10.  Хранимые процедуры.. 53

2.10.1. Системные хранимые процедуры.. 54

2.10.2. Расширенные хранимые процедуры.. 54

2.10.3. Создание хранимой процедуры.. 55

2.10.4 Удаление хранимых процедур. 58

2.11.  Использование курсоров. 58

2.11.1. Виды курсоров. 60

2.11.2. Курсоры Transact-SQL. 62

2.11.3. Работа с курсорами. 66

2.12.  Триггеры.. 67

2.12.1. Использование триггеров. 67

2.12.2. Создание триггера. 69

2.12.3. Удаление триггера. 72

3.   ИНТЕРНЕТ-СИСТЕМА КЛАССИФИКАТОРЫ.. 73

3.1. Перечень классификаторов. 73

3.2. Предлагаемая схема БД для  реализации системы ведения справочников. 78

3.3. Назначение и структура таблиц. 79

3.4. Пользовательский интерфейс. 83

ЗАКЛЮЧЕНИЕ. 90

СПИСОК ЛИТЕРАТУРЫ.. 91

ПРИЛОЖЕНИЕ. 92

Программный код Index.php. 92

Программниый код Rirht.php. 94

Программный код Left.php. 96

Программный код Top.php. 97

Программный код Node.php. 99

Программный код Export.php. 100

 

 

 

 

 

 

 

 

 

 

 ВВЕДЕНИЕ

 

Проектирование интернет-систем  —  сложная и длительная работа, требующая высокого профессионализма.

Интернет-система – справочная система, предназначенная для получения пользователем максимально точной информации по интересующей его теме.

Интернет-система Классификаторы - это систематизированный перечень наименований объектов, каждому из которых в соответствие дан уникальный код.

Основные задачи ведения общероссийских классификаторов - по законодательству РФ :
- научно-методическое и организационное обеспечение работ по ведению общероссийских классификаторов;
- поддержание общероссийских классификаторов в достоверном состоянии;
- информационное обслуживание заинтересованных юридических и физических лиц в части общероссийских классификаторов и вносимых в них изменений.

В России Общероссийский классификатор — классификатор, принятый Госкомстатом России и обязательный для применения при межотраслевом обмене информацией и в общероссийских унифицированных формах документов (УФД). Общероссийский классификатор не должен противоречить соответствующим международным классификаторам.

Общероссийские классификаторы должны соответствовать требованиям Единой системы классификации и кодирования технико-экономической и социальной информации РФ (ЕСКК) ТЭСИ. Национальные и отраслевые классификаторы являются нормативными документами, внесение изменений в которые должны согласовываться с Госкомстатом и Комитетом РФ по стандартизации, метрологии и сертификации.

Перечень общероссийских классификаторов содержится в Общероссийском классификаторе информации об общероссийских классификаторах (ОКОК).

«Всероссийский научно-исследовательский институт по информатизации АПК» (ВНИИ «Агросистема») является ведущей научной организацией Министерства сельского хозяйства Российской Федерации по вопросам комплексной информатизации, телекоммуникации и применения Общероссийских классификаторов в системе агропромышленного комплекса и рыболовства, и головной организацией в системе Министерства сельского хозяйства Российской Федерации по ведению Общероссийского классификатора продукции (ОКП) по классам, относящимся к агропромышленному комплексу и рыболовству.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.   СУБД MICROSOFT SQL SERVER 2000

 

1.1 Общие сведения о базах данных

 

База данных представляет собой хранилище информации, представленное одним или несколькими файлами. В настоящее время наиболее широко используются так называемые реляционные базы данных, в которых информация организована в виде таблиц, состоящих из строк и столбцов. Таблицы могут быть связаны между собой, образуя нередко сложную систему. Создание серьезных баз данных и доступ ним обеспечивается особой системой управления базами данных (СУБД). Вместе с тем доступ к базам данных через СУБД возможен и из приложений, написанных на том или другом языке программирования. 

PHP имеет наборы специальных функций для работы с многими СУБД, такими как Microsoft SQL Server (MS SQL), MySQL, Oracle, PostgreeSQL, mSQL, Informix, Sybase, Ingres и IBM DB2. Кроме того,  PHP поддерживает стандарт ODBC (Open Database Connectivity — открытый интерфейс доступа к базам данных), который поддерживают почти все реляционные СУБД. Используя ODBC, можно обращаться к таким СУБД, как MS Access.

СУБД устанавливается независимо от PHP. Чтобы работать с ней посредством PHP-сценария, следует установить соответствующую данной СУБД библиотеку функций. При работе в Windows для СУБД Ms SQL  требуется библиотека php_mssql.dll. При установке PHP библиотеки для работы с СУБД автоматически не устанавливаются.

Большинство современных СУБД поддерживают язык SQL (Structured Query Language — структурированный язык запросов), посредством которого формируются выражения, называемые запросами к базе данных. Запросы, выполняемые СУБД, позволяют создавать и удалять базы данных, создавать и удалять таблицы, содержащиеся в базах данных, а также добавлять, редактировать, удалять и выбирать данные в таблицах. Кроме того, они позволяют выполнять и обработку данных. Более того, с помощью SQL-запросов можно производить администрирование баз данных: определять пользователей (имя и пароль), устанавливая их права (привилегии) на использование базы данных.

Запросы на языке SQL могут возвращать, а могут и не возвращать данные. Например, запрос на выборку данных по некоторому критерию возвращает данные, а запрос на создание новой таблицы или, например, удаление записей — нет. Результатом выполнения SQL-запроса на выборку данных является набор записей (временная таблица), удовлетворяющих условию запроса. Если таких записей в базе данных не оказалось, то возвращаемая таблица будет пустой. Если же запрос вернул какие-то записи, то их набор доступен PHP-сценарию и вы можете работать с ним как с массивом.

 

1.2. Установка Microsoft SQL Server 2000

 

Процедура инсталляции Microsoft SQL Server 2000 с установочного CD довольно проста. Если инсталлятор не запустился автоматически, то следует запустить программу \x86\setup\setupsql.exe, расположенную на установочном CD. Ниже приведен один из возможных вариантов установки, пригодный для большинства новичков, работающих на локальном компьютере:

1. Local Computer (локальный компьютер).

2. Server and Client Tools (инструменты сервера и клиента). При этом будет инсталлирован сам сервер и средства администрирования.

3. Настройка учетных записей служб:

  • Use the same account for each service. Auto start SQL Server Service (использовать одну учетную запись для всех служб с их автоматическим запуском при загрузке операционной системы).

  • Use the Local System account (использовать локальную учетную запись).

  •Auto Start Service (автоматический запуск служб при загрузке операционной системы).

4. Typical (установка всех компонентов).

После инсталляции сервера баз данных в меню Windows Пуск/Программы/Microsoft SQL Server запустите утилиту Enterprise Manager, которая предоставляет пользовательский интерфейс для настройки, управления и доступа к данным на сервере (рис. 7.1).  В левой части этого окна отображается древовидный список, в котором щелчком левой кнопкой мыши следует раскрыть узел Microsoft SQL Servers/SQL Server Group. Если установка прошла успешно, то в этом узле должен находиться узел, имя которого состоит из имени вашей учетной записи, за которым следует “(Windows NT)”. На рис. 1.1 это — 1-28 (Windows NT). В правой части окна отображаются элементы того узла, который выделен в левой части окна (в дереве).

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

Рис. 1.1.

Чтобы создать базу данных, в древовидном списке окна утилиты Enterprise Manager раскройте узел, соответствующий вашей учетной записи (на рис. 7.1 это — DVV (Windows NT)). Среди содержащихся в нем подузлов имеется Databases (Базы данных). Щелкните на нем правой кнопкой мыши и в раскрывшемся контекстном меню выберите New Database (Новая база данных). В результате откроется диалоговое окно Database Properties (Свойства базы данных). В поле Name (Имя) введите имя базы данных и щелкните на кнопке OK. В результате в узле Databases появится узел с именем, совпадающим с именем базы данных.

 

 

1.3. Основные средства PHP для взаимодействия с базой данных

 

При взаимодействии сценария с базой данных обычно выполняются следующие действия:

1. Подключение к серверу базы данных (предполагается, что сервер базы данных запущен)

2. Передача SQL-запроса, который должен быть выполнен СУБД. SQL-запрос представляется на язык SQL. Он оформляется в виде строки и передается специальной PHP-функции в качестве параметра. Эта функция свяжется с СУБД и передаст ей SQL-запрос. СУБД его выполнит (если нет ошибок и других проблем). Если SQL-запрос предполагает возврат данных, то они будут получены с помощью специальной PHP-функции.

3. Получение от СУБД данных, соответствующих переданному ранее  SQL-запросу. С помощью специальных функций можно получить данные и далее их обработать (например, просто вывести на экран).

4. Обработка полученных данных. Вы можете отформатировать по своему усмотрению или подвергуть более сложному анализу и преобразованию полученных данных.

5. Отключение от базы данных, если не предполагается повторно выполнить этапы 2 — 4. Отключаться от базы данных рекомендуется всякий раз, как только вы прекращаете работать с ней на более или менее длительный срок.

Эти и другие действия в PHP-сценарии выполняются посредством соответствующих функций.

 

1.4. Подключение к базе данных

 

Подключение к базе данных (БД) осуществляется с помощью специальных функций PHP, которым передаются в качестве параметров следующие данные:

 •Местоположение (host) — для многих серверов БД это доменное имя или IP-адрес компьютера, на котором расположена БД; если она находится на том же компьютере, что и модуль PHP, то достаточно указать localhost. Для MS SQL Server указывается его имя. При необходимости можно указать череp двоеточие порт, который прослушивается сервером базы данных.

  •Регистрационное имя (username) — строка символов, соответствующая имени пользователя, под которым он может получить доступ к БД; сообщается администратором БД.

  •Пароль (password) — строка символов, которая вместе с регистрационным именем, служит для обеспечения доступа к БД; сообщается администратором БД.

  •Имя базы данных. — СУБД может поддерживать несколько БД, каждая из которых должна иметь уникальное имя. Вы должны указать имя конкретной БД, с которой хотите работать.

При подключении к базам данных под управлением разных СУБД в PHP используются различные функции. Ниже приведены примеры подключения к базе данных для двух популярных СУБД.

   $connect=mssql_connect(имя_сервера_БД, username, password);

$db=mssql_select_db(имя_БД, $connect);

Для подключения к БД MS SQL Server требуется две функции:

•Первая функция (…_connect()) выполняет соединение с сервером БД и возвращает идентификатор соединения при успехе и false — при неудаче. При этом в первом параметре этой функции имя сервера БД, устанавливаемое при регистрации сервера. Идентификатор соединения, возвращаемый функцией, используется в сценарии, в частности, при выборе базы данных, создании запросов и т.д.

 • Вторая функция (…_select()) выбирает конкретную базу данных на сервере, на который указывает идентификатор $connect, возвращенный первой функцией. Эта функция возвращает true при успешном завершении операции и false — в противном случае. Если требуемая база данных еще не создана, то это необходимо сделать. Так, в MS SQL Server базу данных (хотя бы пустую) можно создать с помощью утилиты Enterprise Manager или с помощью соответствующих выражений SQL, которые могут быть введены с помощью оконного интерфейса, либо сформированы и выполнены посредством PHP-сценария.

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

mssql_close($connect) — для MS SQL Server.

 

1.5. Передача запросов к базе данных

 

SQL-запрос к базе данных в качестве строкового параметра передается специальной функции PHP, которая в свою очередь передает его СУБД. СУБД выполняет этот запрос, а PHP-функция возвращает указатель на временную таблицу данных, являющуюся результатом выполнения запроса.

mssql_query(SQL_запрос, идентификатор_соединения); 

Пример подключения к серверу MS SQL Server:

/* Подключение к серверу БД: */

$connect=mssql_connect("1-28", "tst", "tst") or

exit("Не удалось соединиться с сервером");

/* Выбор БД: */

$db=mssql_select_db("classifier")

exit("Не удалось выбрать БД");

$strsql=”SELECT * FROM Objects ”;   // строка с SQL-запросом

$selectall=mssql_query($strsql, $connect); // выполнение SQL-запроса

$mssql_close($connect); // отключение от БД

Здесь производится подключение к MS SQL Server с именем 1-28 (устанавливается при регистрации сервера) для пользователя с регистрационным именем tst и паролем tst. Затем выбирается база данных classifier и выполняется SQL-запрос на выборку из таблицы Objects всех полей (столбцов)и записей (строк). Наконец, соединение с БД разрывается.

Подключение к серверу и выбор БД может оказаться не удачным по том или иным причинам. Однако выполнение сценария продолжится, что может оказаться бессмысленным и вызвать лавинообразный вывод сообщений об ошибках. Чтобы это не происходило, используется функция exit() (или die()), выводящая указанное сообщение и прекращающая дальнейшее выполнение сценария.

 

1.6. Обработка данных в сценарии

 

Выбор нужных данных из одной или нескольких таблиц выполняется с помощью SQL-запроса, начинающегося с ключевого слова (оператора) SELECT. Критерий (условие) выбора данных формулируется в выражении SQL-запроса вслед за ключевым словом WHERE. Результатом выполнения такого запроса является временная таблица (возможно, пустая, если нет данных, удовлетворяющих условию запроса). Функция PHP, выполняющая запрос, возвращает указатель на полученную в результате временную таблицу. Этот указатель используется в PHP-сценарии для доступа к данным с помощью специальных функций.

Довольно часто данные из временной таблицы читают в массив, а затем его обрабатывают в сценарии (например, выводят на экран, изменяют значения, производят вычисления и т.п.).  Если требуется изменить значения полей таблицы, добавить новую или удалить имеющуюся запись, то формируют строку с соответствующим SQL-запросом, а затем передают ее в качестве параметра функции, выполняющей запрос (например, mssql_query()).

Чтение в массив записей временной таблицы, полученной в результате выполнения SQL-запроса, производится функциями, в имени которой находится слово fetch (достать). Например, функция mssql_fetch_assok() читает текущую запись таблицы БД MS SQL Server в массив с символьными индексами (ключами). При этом значения индексов совпадают с именами соответствующих полей таблицы. mssql_fetch_row() создает аналогичный массив, но с числовыми индексами, значения которых совпадают с номерами полей таблицы.

 

1.7. Создание базы данных

 

Для создания базы данных под управлением MS SQL Server запустите утилиту Enterprise Manager (рис. 7.8). В древовидном списке в левой части окна этой утилиты раскройте группу узлов с именем сервера БД: Microsoft SQL Servers/SQL Server Group/Имя_сервера (Windows ТЕ). Щелкните правой кнопкой мыши на узле Databases  и в раскрывшемся контекстном меню выберите New Database (Новая база данных). В открывшемся диалоговом окне введите имя БД и щелкните на кнопке OK. В результате это имя появится в древовидном списке в группе Databases.

 

Рис. 1.2.

 

1.8 Создание таблицы для хранения данных

 

Созданная база данных пока не содержит ни одной пользовательской таблицы. Теперь необходимо создать таблицу, в которой будут храниться данные гостевой книги. Для этого следует щелкнуть правой кнопкой мыши на имени БД в древовидном списке и в контекстном меню выбрать  Создать, а затем — Table. В результате откроется диалоговое окно New Table inимя БДonИмя сервера БД(рис. 7.9), в котором можно определить поля (столбцы) таблицы, т.е. задать их имена, типы, размеры и другие характеристики. Помимо полей, которые предназначены для хранения данных, зададим поле, значения которого присваиваются автоматически и являются уникальными идентификаторами записей. Это — поле с именем ID, а его характеристики показаны на рис. 7.9.

Рис. 1.3.

После закрытия окна предлагается сохранить таблицу под требуемым именем (например, Objects).

 

 

 

 

 

 

 

2.   ИСПОЛЬЗОВАНИЕ SQL SERVER 2000

 

2.1 Инструменты SQL Server 2000

 

2.1.1. Enterprise Manager

 

Данный инструмент является базовым при выполнении самых разнообразных задач:

1. Управление системой безопасности;

• создания баз данных и ее объектов;

• создания и восстановление резервных копий;

• конфигурирования подсистемы репликации;

• управления параметрами работы служб SQL Server 2000;

• управления подсистемой автоматизации;

2. Запуск, останов и приостановка служб;

• конфигурирование связанных и удаленных серверов;

• создания, управления и выполнения пакетов DTS.

Большая часть административных задач SQL Server 2000 может быть выполнена следующими методами:

• использованием средств Transact-SQL;

• с помошью графического интерфейса Enterprise Manager;

• с помощью мастеров (wizards).

Инструмент Enterprise Manager разрабатывался с целью облегчить пользователям выполнение наиболее актуальных административных задач, сочетая при этом простоту работы с высокой функциональностью. Enterprise Manager является действительно достаточно простым в использовании инструментом, в то же время он охватывает практически все административные задачи, с которыми столкнется администратор

2.1.2. SQL Server Service Manager

 

Единственной задачей утилиты SQL Server Service Manager является предоставление пользователю удобного механизма запуска, останова и приостанова служб SQL Server 2000. Кроме этого, она позволяет лишь запретить или разрешить автоматический запуск той или иной службы при загрузке операционной системы.

Утилита Service Manager устанавливается при инсталляции SQL Server 2000 и по умолчанию автоматически запускается при загрузке операционной системы. В нормальном состоянии утилита Service Manager представлена значком в правой части панели задач (taskbar). Двойной щелчок на пиктограмме приведет к открытию окна программы, с помощью которого можно запускать, останавливать и приостанавливать службы SQL Server 2000, а также разрешать или запрещать их автоматический запуск при загрузке операционной системы.

 

2.1.3. SQL Server Profiler

 

Утилита SQL Server Profiler — это графический инструмент, с помощью которого администратор может наблюдать за теми или иными аспектами работы SQL Server 2000. В основе работы этой утилиты лежит тот же принцип, что и в основе работы утилиты Performance. При выполнении пользовательских запросов, хранимых процедур, команд Transact-SQL, подключении к серверу и отключении от него, а также множества других действий, ядро SQL Server 2000 сохраняет в системных таблицах массу различной информации о ходе выполнения операций. Эта информация может быть получена с помощью специальных хранимых процедур. Утилита SQL Server Profiler использует эти хранимые процедуры для получения необходимой информации. Полученные данные затем представляются в удобном виде с помощью графического интерфейса. Однако пользователи могут получать информацию о процессах SQL Server 2000, обращаясь напрямую к хранимым процедурам. В принципе, на основе этих хранимых процедур можно даже написать свое собственное приложение, которое будет отображать информацию о работе SQL Server 2000 в нужной форме.

 

2.1.4. Query Analyzer

 

Этот инструмент предназначен для выполнения запросов и анализа их исполнения. По частоте использования и важности Query Analyzer сравним с Enterprise Manager. Окно SQL Query Analyzer разделено на три части. В

левой части выводится так называемый браузер объектов (Object Browser), с помощью которого можно просмотреть список всех объектов, расположенных в любой базе данных сервера, а также перечень встроенных функций и системных типов данных. Браузер объектов можно легко отключить. Для этого достаточно просто нажать клавишу <F8> либо выбрать пункт в меню Tools команду Object Browser, а затем команду Show/hide. Аналогичным способом можно и отобразить браузер объектов. Принципиальным является возможность трассировки выполнения хранимых процедур. Для начала трассировки достаточно в контекстном меню интересующей хранимой процедуры выбрать пункт Debug. В ответ откроется окно Debug Procedure, предназначенное для указания значений параметров хранимой процедуры, с которыми она будет запущена. При выполнении трассировки пользователи могут использовать точки останова (break points), а также осуществлять пошаговое выполнение команд процедуры.

Помимо выполнения запросов и хранимых процедур, с помощью Query Analyzer можно оценить производительность исполнения запроса. Для этого следует разрешить отображение оценочного (estimated) или результирующего плана исполнния (execution plan) запроса, что можно выполнить с помощью меню Query, выбрав в нем соответственно пункты Display Estimated Execution Plan и Display Execution Plan. Отметим, что оценочный план исполнения запроса формируется на основе предположений сервера о затратах на выполнение отдельных шагов запроса. Результирующий же план исполнения запроса генерируется после выполнения запроса и отражает реальное положение дел. Конечно, в идеальной ситуации значения оценочного и результирующего планов исполнения будут совпадать. Однако при работе с многопользовательскими системами вполне может оказаться, что реально исполнение запроса займет больше времени, чем ожидалось. Чаще всего это происходит из-за занятости процессора выполнением запросов других пользователей или блокированием необходимых для выполнения запроса ресурсов другими транзакциями.

 

2.1.5. Upgrade Wizard

 

Мастер Upgrade Wizard предназначен для выполнения обновления баз данных SQL Server 6.5 до SQL Server 2000. В процессе обновления на SQL Server 2000 будут перенесены собственно данные, а также весь набор объектов обновляемой базы данных, включая хранимые процедуры, триггеры, правила, умолчания, ограничения целостности, представления. Кроме того, также окажутся перенесенными пользователи базы данных со всеми установленными правами доступа к объектам базы данных и т. д. Помимо этого, в процессе обновления также будут скопированы все настройки подсистемы репликации.

 

 

 

 

2.1.6. Import and Export Data

 

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

решения простых задач. Если необходимо закачать в таблицу базы данных информацию из файла MS Excel, то возможностей мастера будет вполне достаточно. Таким образом, даже неопытные пользователи смогут выполнять основные операции обмена данными.

 

2.1.7. Client Network Utility и Server Network Utility

 

Наличие протокола не достаточно для сетевой работы SQL Server 2000. Для того чтобы клиенты смогли установить соединение с сервером, как на клиенте, так и на сервере, необходимо добавить специальные сетевые библиотеки (Network Library). Эти библиотеки реализованы в виде динамически подключаемых библиотек (DLL, dynamic link library) и подключаются к операционной системе. Библиотека расширяет базовые возможности протокола и является как бы надстройкой над ним, выполняющей различные сетевые операции по обмену данными между

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

Библиотеки можно инсталлировать как в процессе установки SQL Server 2000, так и позже. Если требуется добавить или удалить библиотеку уже после установки, то для этого нужно использовать утилиту Server Network Utility, устанавливающуюся вместе с SQL Server 2000. С помощью этой библиотеки конфигурируются сетевые параметры собственно сервера. То есть указываются сетевые библиотеки, с помощью которых пользователи смогут обращаться к серверу. Однако со стороны клиента также требуется присутствие сетевых библиотек и конфигурирование их для работы с сервером. Конфигурирование клиента выполняется с помощью утилиты Client Network Utility, добавляемой при установке инструментов администрирования SQL Server. Сконфигурированные параметры будут использоваться для работы Enterprise Manager, Query Analyzer и других инструментов администрирования. Чтобы гарантировать, что взаимодействие клиента с сервером окажется успешным, следует обеспечить использование

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

 

2.1.8. Утилиты командной строки

 

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

мастер соответствующим образом конфигурирует переменную окружения PATH.

2.1.9. Мастера

 

Многие задачи могут быть выполнены с помощью средств Transact-SQL, с использованием графического интерфейса Enterprise Manager и посредством специальных мастеров (wizards). Мастера являются наиболее простым способом выполнения административных задач. Недостатком мастеров являются достаточно ограниченные возможности. Однако к некоторым из мастеров сказанное не относится. К ним можно отнести мастеров конфигурирования подсистемы репликации, что является довольно сложным процессом. Например, создать публикацию средствами Enterprise Manager нельзя. Нужно будет воспользоваться соответствующим мастером. Конечно, всегда можно воспользоваться средствами Transact-SQL. Но иногда это настолько сложно и трудоемко, что лучшим решением будет использование мастера. Для запуска мастера следует в панели инструментов Enterprise Manager нажать кнопку Run a wizard. В ответ откроется окно Select Wizard, с помощью которого можно будет выбрать необходимый мастер.

 

2.2. Введение в проектирование баз данных

 

2.2.1. Классификации баз данных

 

По принципам обработки базы данных классифицируются следующим образом:

• Централизованная база данных. При использовании этой технологии база

данных располагается на одном компьютере, который может даже не иметь

поддержки сети и работать автономно. В этом случае работа с базой данных

возможна только локально. Если же компьютер работает в сети, то доступ к

информации может осуществляться удаленно с других компьютеров сети.

Централизованные базы данных с распределенным доступом являются наиболее используемыми в настоящее время. Для этой технологии возможны два способа обработки данных:

Файл-сервер. Эта архитектура централизованных баз данных с сетевым доступом предполагает назначение одного из компьютеров сети в качестве выделенного сервера, на котором будут храниться файлы централизованной базы данных.

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

• Распределенная база данных. Базы данных этого типа располагаются на нескольких компьютерах. Информация на этих компьютерах может пересекаться и даже дублироваться. Для управления подобными базами данных предназначена система управления распределенными базами данных (СУРБД). Работа с распределенной базой данных может быть прозрачна для пользователей. Система скрывает от клиентов обращения к данным, расположенным на других компьютерах. Для пользователя все выглядит так, как будто вся информация находится на одном сервере. Распределенные базы данных неполучили большого распространения.

 

2.2.2. Структурные элементы базы данных

 

Целью любой информационной системы является хранение и обработка данных о каких-либо объектах. В широком смысле слова база данных —- это совокупность сведений о конкретных объектах. При создании базы данных (БД) в основном преследуется цель упорядочить данные по различным признакам, чтобы иметь возможность быстро извлекать нужную нформацию. В современной технологии баз данных предполагается, что создание БД, ее поддержка, управление, а также доступ пользователей к самим данным осуществляются с помощью специальных программных продуктов — систем управления базами данных (СУБД).

В терминологии баз данных описываемые объекты часто называют сущностями (entity), а сами данные — атрибутами (attribute). Объект (или сущность) — это нечто, существующее в реальном мире и различимое, что имеет название и имеется способ отличать один подобный объект от другого. Сущностью может являться ВУЗ, студент, ручка, аудитория и т. д. Кроме того, помимо физического предмета сущностью могут являться и бстрактные вещи, которые, тем не менее, могут быть описаны: лекция, телевизионная передача, правовые нормы, правила поведения и т. д. Группа всех подобных объектов образует набор объектов. Набором объектов для объекта сотрудник" будут являться все сотрудники, работающие на предприятии.

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

Помимо понятий сущность и атрибут, при работе с базами данных часто ис-

пользуются понятия поле, запись, таблица. Поле (field) — это минимальная неделимая структура организации данных. Для каждого поля базы данных разработчик должен задать следующие значения:

• уникальное в пределах отношения имя (name);

тип данных, которые будут храниться в поле (числовой, символьный, логический и т. д.);

• максимальная длина (или размер), который могут иметь данные, ранящиеся

в поле;

• дополнительные характеристики (например, для числовых данных — точность, для символьных — формат, и т. д.).

Множество логически связанных полей образуют запись (record). Запись является ничем иным, как строкой таблицы. Экземпляр записи — это отдельная реализация записи, содержащая конкретные значения ее полей. Множество экземпляров записи одной структуры образуют таблицу (table). При описании таблицы указывается последовательность расположения полей и их основные характеристики (имя, длина и точность). Количество записей в таблице может меняться.

 

2.2.3. Модели данных

 

За все время использования компьютеров для обработки данных было разработано множество различных моделей данных. Однако обычно говорят лишь о трех основных моделях:

• Иерархическая модель данных. Эта модель данных представляет собой совокупность связанных элементов, образующих иерархическую структуру. Связанные объекты образуют перевернутый граф (перевернутое дерево). К основным понятиям иерархической модели данных относятся уровень, элемент (или узел) и связь. Узлом называется совокупность атрибутов данных, описывающих некоторый объект. Каждый узел связан с одним узлом более высокого уровня и с любым количеством (в т. ч. и с нулем) узлов нижнего уровня. Исключением является узел самого высокого уровня, который не связан ни с одним узлом более высокого уровня. Этот узел называется корнем дерева. Подчиненные узлы располагаются на втором, третьем и т. д. уровнях. Количество деревьев в базе данных определяется количеством корней деревьев. К каждой записи базы данных существует единственный путь от корневой записи. Примером иерархической модели данных может служить адрес.

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

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

Система управления базами данных Microsoft SQL Server 2000, как и большая часть других современных СУБД, предназначена для работы именно с реляционными базами данных. SQL Server 2000 обеспечивает построение централизованных баз данных с помощью технологии клиент-сервер.

 

2.2.4. Проектирование реляционных баз данных

 

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

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

 

2.2.5. Связывание таблиц. Первичный и внешний ключи

 

Связывание строк таблиц реляционной базы данных выполняется с помощью первичного (primary) и внешнего (foreign) ключей. Разработчик базы данных должен определить правила связывания данных в разных таблицах, выделив в них одну или более колонок в качестве первичного или внешнего ключа.  Первичный ключ позволяет однозначно идентифицировать любую строку таблицы. При выборе столбцов, которые будут входить в состав первичного ключа, необходимо следовать требованиям уникальности и минимальности. При создании первичного ключа в SQL Server 2000 пользователь может выбрать любой набор столбцов. Единственное ограничение — совокупность значений выбранных столбцов должна быть уникальна для каждой строки. В качестве первичного ключа могут быть использованы как уже имеющиеся столбцы таблицы, так и новые столбцы, специально созданные для этих целей.

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

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

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

Возможны следующие варианты поведения SQL Server 2000 при удалении строк из главной таблицы:

• Установление (Relation). При удалении первичного ключа SQL Server 2000

будет автоматически устанавливать для всех связанных внешних ключей неопределенное значение (NULL). Впоследствии такие строки могут быть удалены вручную или связаны с другим первичным ключом.

Ограничение (Restrict). Перед тем, как станет возможным удаление строки в главной таблице, ни в одной зависимой таблице не должно быть строки,

имеющей то же значение внешнего ключа, что и первичный ключ удаляемой

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

• Каскадирование (Cascading). В этом режиме система станет автоматически удалять все связанные строки из зависимых таблиц. Этот метод требует от пользователя минимального количества усилий.

 

2.2.6. Типы связей между таблицами

 

Существуют следующие виды связей:

Один-к-одному (One-to-one). При установке отношения "один-к-одному" (1:1) каждой строке главной таблицы соответствует единственная (или ни одной) строка зависимой таблицы. С другой стороны, каждая строка зависимой таблицы должна быть связана только с одной строкой главной таблицы.

Один-ко-многим (One-to-many). При использовании связи "один-ко-многим" (1:п) каждой строке главной таблицы соответствует ноль, одна или более строк зависимой таблицы. С другой стороны, каждая строка зависимой таблицы должна быть связана только с одной строкой главной таблицы.

Много-ко-многим (Many-to-many). Этот тип связи предполагает, что любой строке главной таблицы может соответствовать ноль, одна или множество строк зависимой таблицы. При этом каждая строка зависимой таблицы может быть связана с одной или более строк главной таблицы.

Ядро SQL Server 2000 поддерживает только отношения "один-ко-многим". Реализация остальных двух типов отношения лежит на пользователе

 

 

2.3. Транзакции и блокировки

 

2.3.1. Основы транзакций

 

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

(distributed transaction) можно изменять строки в разных базах данных. SQL

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

По умолчанию каждая команда Transact-SQL рассматривается как отдельная

транзакция. В обычном режиме ни одна команда изменения данных не может

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

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

Имеются определенные требования к выполнению транзакций системой управления базами данных. Эти требования, известные как требования ACID (Atomicity, Consistency, Isolation и Durability), описывают то, как должны обрабатываться данные и в каком состоянии они должны находиться после завершения транзакции. Рассмотрим эти требования.

Атомарность (Atomicity). Все изменения данных, выполненные в транзакции, рассматриваются как единый минимальный блок. Зафиксированными могут оказаться либо все изменения, выполненные в транзакции, либо данные будут восстановлены в состоянии, в котором они были до начала транзакции.

• Согласованность (Consistency). После того, как транзакция будет успешно

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

сделанные изменения.

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

Устойчивость или долговечность (Durability). После того, как транзакция выполнит все необходимые изменения и ее работа будет завершена, система выполняет фиксирование транзакции (commit transaction). После этого система не может быть возвращена в состояние, в котором она была до начала транзакции. Даже если сразу же после фиксирования транзакции произойдет неожиданный крах или останов системы, то при следующем запуске начнется повторное фиксирование транзакции, и данные будут находиться в состоянии, в котором они должны находиться после завершения транзакции.

 

2.3.2. Основы блокировок

 

Блокировкой (locks) называется временное ограничение, накладываемое системой на использование тех или иных ресурсов. Блокировки используются для обеспечения изолированности транзакций друг от друга. Пользователи SQL Server 2000 могут выполнять множество разнообразных операций обработки данных.

В SQL Server 2000 имеется масса различных типов блокировок, обеспечивающих максимально эффективную работу множества пользователей с одними и теми же данными. По возможности система старается применить как можно менее жесткий режим блокирования, обеспечивая тем самым доступ к данным пользователей. Управлением наложением и снятием блокировок, а также разрешением конфликтов в SQL Server 2000 занимается менеджер блокировок (Lock Manager). Блокировки могут налагаться как на отдельную строку таблицы, так и на всю таблицу целиком. Помимо этих крайних вариантов, блокировки могут возникать на уровне страницы(page) или группы страниц — экстента (extent).

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

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

• Проблема последнего изменения (The lost update problem). При одновременной попытке нескольких транзакций изменить одни и те же данные часть их будет неизменно утеряна. В процессе сохранения изменений транзакции последовательно сохраняют новые данные. В итоге останутся изменения, выполненные последней завершившейся транзакцией. Если следующие команды транзакций зависят от проделанных изменений, то, вероятно, что конечный результат работы транзакции будет неверным. Возможно, с точки зрения СУБД все будет выглядеть нормально, т. е. не будут нарушены никакие ограничения целостности и правила. Однако логическая целостность данных может быть нарушена.

• Проблема "грязного" чтения (The uncommitted dependency problem). Эта проблема возникает, когда транзакция пытается считать данные, обрабатываемые другой транзакцией, и находящиеся в стадии обработки. При этом данные могут нарушать ограничения целостности и правила, тем самым нарушая общую целостность данных. Естественно, результат, полученный при использовании неверных данных, также будет неверен.

Проблема неповторяемого чтения (The inconsistent analysis problem). Эта проблема связана с многократным чтением транзакцией одних и тех же данных. Между операциями чтения некоторая транзакция может изменить данные, так что при следующем сканировании первая транзакция будет оперировать уже другими данными. В процессе чего получаются неверные результаты.

Проблема чтения фантомов (The phantom read problem). Эта проблема возникает, когда во время выполнения транзакции в таблицу вставляются новые строки, которые могут быть обработаны транзакцией. Предположим, что транзакция осуществляет несколько раз выборку данных из таблицы на основе одного и того же логического условия. Перед началом очередной выборки в таблицу добавляются (или удаляются) строки, удовлетворяющие логическому условию. В результате при сканировании будет обработан иной набор данных, чем при предыдущих сканированиях. Использование различных наборов строк может привести к непредсказуемым последствиям.

Перечисленные проблемы характерны для любых систем управления базами данных, в которых не реализованы механизмы изоляции транзакций друг от друга. Однако в большинстве современных СУБД в той или иной мере механизмы блокирования все же реализованы.

 

 

 

 

2.4. Работа с таблицами

 

2.4.1. Проектирование таблиц

 

Прежде чем вы сможете работать с таблицами, их необходимо создать. Во время этой операции пользователь определяет имя таблицы, имена столбцов, тип хранимых в них данных, значения по умолчанию, возможность хранения неопределенных значений, первичный и внешний ключи и некоторые другие свойства. Создание таблиц в SQL Server 2000 возможно либо с помощью графического интерфейса Enterprise Manager, либо с помощью команд Transact-SQL. К сожалению, мастера создания таблиц в SQL Server 2000 нет.

 

2.4.2 Ограничения целостности

 

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

Ограничения целостности (constraints) — это механизм контроля значений, которые могут храниться в полях строки. В SQL Server 2000 поддерживаются сле-дующие ограничения целостности:

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

• Null — задает возможность хранения неопределенных значений;

Default — определяет значение по умолчанию;

• Unique — гарантирует уникальность значений в столбце;

• Primary Key — определяет первичный ключ;

Foreign Key — определяет внешний ключ;

• No Action — предписывает не выполнять в зависимой таблице никаких действий при удалении или обновлении строк в главной таблице. Это  поведение соответствует поведению SQL Server 7.0;

• Cascade — в данном случае будет осуществляться каскадное изменение значений в зависимой таблице при внесении изменений в главную таблицу.

 

2.4.3. Выбор типа данных

 

Одной из основополагающих характеристик столбца является тип данных (data type). Тип данных определяет диапазон значений, которые можно будет хранить в столбце. Для столбцов могут применяться не все типы данных, поддерживаемые Transact-SQL. В частности, для таблиц не могут быть выбраны типы данных cursor и table. Они служат только для работы с локальными переменными, функциями, процедурами и т. д. В свою очередь, для локальных переменных нельзя использовать некоторые типы данных, успешно поддерживаемые столбцами таблиц. К этим типам данных относятся timestamp, text, ntext и image. Полный список типов данных, применимых для столбцов, приведен в табл. 2.1.

 

Тип данных

Краткое описание

bigint

Целочисленный тип данных, занимающий 8 байт

float

Нецелочисленный тип данных приблизительной точности

ntext

Текстовые данные Unicode длинной до 1 Гбайта

int

Целочисленный тип данных, занимающий 4 байта

real

Нецелочисленный тип данных приблизительной точности

binary

Двоичные данные фиксированной длины до 8000 байт

smallint

Целочисленный тип данных, занимающий 2 байта

datetime

Дата и время высокой точности (8-байтовый)

varbinary

Двоичные данные переменной длины до 8000 байт

tinyint

Целочисленный тип данных, занимающий 1 байт

smalldatetime

Дата и время низкой точности (4-байтовый)

image

Двоичные данные длинной до 2 Гбайт

bit

Один бит, принимает значение либо 0, либо 1

char

Символьные данный не Unicode фиксированной длины до 8000 символов

decimal

Нецелочисленный тип данных фиксированной точности

varchar

Символьные данные не Unicode переменной длины до 8000 символов

timestamp

Временной штамп или версия строки

numeric

Нецелочисленный тип данных фиксированной точности

text

Текстовые данные не Unicode длиной до 2 Гбайт

sqlvariant

Тип данных, позволяющий хранить значения других типов данных

money

Денежный тип данных высокой точности (8-байтовый)

nchar

Символьные данные Unicode фиксированной длины до 4000 символов

smallmoney

Денежный тип данных низкой точности (4-байтовый)

nvarchar

Символьные данные Unicode переменной длины до 4000 символов

uniqueidentifier

Тип данных, предназначенный для хранения глобальных уникальных идентификаторов

Таблица 2.1.

 

2.4.5. Использование автонумерации

 

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

Чтобы разрешить поле таблицы для автоматической нумерации, для него необходимо установить свойство IDENTITY (ID entity, идентификационный номер сущности). При этом пользователь должен задать начальное значение и шаг приращения. Первая вставляемая в таблицу строка будет иметь значение, указанное как начальное. При вставке каждой следующей строки значение в поле со свойством IDENTITY станет монотонно увеличиваться на шаг приращения. Каждая вновь вставляемая строка будет иметь уникальное в пределах таблицы значение. Даже если вы удалите десять последних вставленных строк, новая строка будет иметь уникальное значение, не пересекающееся со значением ни одной удаленной строки. Таким образом обеспечивается уникальность значений в таблице. Для разрешения вставки значений в столбец-счетчик применяется команда:

SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON I OFF }

Вставка в столбец-счетчик явных значений может быть разрешена только на

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

 

2.5. Использование представлений

 

Представления (views) являются виртуальными таблицами, содержимое которых генерируется динамически на основе результата выполнения запроса. Для пользователей работа с представлением мало отличается от работы с таблицами, хотя имеются определенные отличия.

При создании запроса указывается запрос SELECT, который будет формировать содержимое представления. В этом запросе могут применяться все разделы команды SELECT. То есть пользователь может выполнять объединение (join) и слияние (union) данных, различные выражения, группировку, агрегирование и логические условия. Если в представление, созданное на основе одной таблицы, не включается один или более столбцов исходной таблицы, то говорят, что на таблицу наложен вертикальный фильтр. Если же в запросе, на основе которого формируется представление, используется логическое условие, накладывающее ограничение на диапазон включаемых в представление строк, то говорят, что на таблицу наложен горизонтальный фильтр. Одновременно в представлении могут присутствовать как вертикальный, так и горизонтальный фильтры.

В простейшем случае представление является полной копией данных одной таблицы. В этом случае запрос, на основе которого создается представление, выглядит как SELECT * FROM <table_name>.

Более сложные представления создаются на основе множества таблиц. Так как запрос SELECT позволяет обращаться к представлениям, то представление также способно строиться на основе других представлений, которые, в свою очередь, могут быть созданы на основе таблиц или других представлений. Максимальная вложенность представлений не должна превышать 32 уровней.

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

Так как представление является, по сути, всего-навсего поименованным запросом SELECT, для него нельзя определить ограничения целостности, триггеры, правила или умолчания. При необходимости эти объекты должны быть созданы на уровне таблиц, на основе которых формируется само представление, а также другие используемые для его создания  представления. Также для представления не допускается создание индексов и статистики.

 

2.5.1. Создание представления

 

Создание представлений в SQL Server 2000 можно выполнить различными методами:

• с помощью Enterprise Manager;

• с помощью мастера Create View Wizard;

•  средствами Transact-SQL.

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

Однако оба перечисленных метода, в конце концов, обращаются к средствам

Transact-SQL, с помощью которых собственно и выполняется создание представления. Ничто не мешает пользователям применять для создания представлений непосредственно команды Transact-SQL, не прибегая к помощи графического интерфейса.

 

2.6. Индексы

 

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

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

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

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

SQL Server 2000 не является исключением. Если в ходе выполнения запроса

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

 

2.6.1. Использование индексов

 

Конечно же, использование индексов призвано повысить скорость поиска и выборки данных. Однако прежде чем принимать решение о создании какого либо количества индексов и их типе, необходимо продумать их назначение и учесть интенсивность использования индексируемых данных. Иначе вместо увеличения производительности выполнения запросов можно добиться обратного эффекта. Дело в том, что при изменении данных (в т. ч. вставке и удалении) в таблице помимо обновления самих данных необходимо будет произвести и обновление индексов, на что может уйти столько же времени, сколько и на изменение данных. Для индексирования следует выбирать столбцы, наиболее часто используемые в запросах в качестве критериев поиска или сортировки. Соответственно не стоит индексировать столбцы, которые только выбираются и не применяются в качестве критериев поиска. Например, если у вас есть таблица, имеющая около десяти столбцов и только два из них, содержащих идентификационный номер и дату, используются в разделе WHERE В качестве критериев ограничения диапазона выбираемых строк, то индексировать стоит только эти два столбца. Индексирование других столбцов не может дать увеличения производительности, т. к. эти столбцы не используются для поиска данных. Также не следует индексировать слишком объемные столбцы, длина которых

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

В SQL Server 2000 реализовано несколько типов индексов:

некластерный индекс (Nonclustered Index)

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

• кластерный индекс (Clustered Index)

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

уникальный индекс (Unique Index)

Уникальный индекс предназначен для обеспечения уникальности значений соответствующего индекса.

 

 

 

2.7. Функции SQL Server 2000

 

В SQL Server 2000 существует возможность создания определяемых пользователем функций. Таким образом, пользователь может создавать свои собственные функции, на которые можно будет ссылаться непосредственно в теле запроса. Как и хранимые процедуры определяемые пользователем функции могут иметь параметры. Интересным сочетанием является использование в качестве возвращаемого функцией значения величины типа данных table. Это дает возможность применения запросов, обращающихся непосредственно к функции.

 

2.7.1. Встроенные функции

 

Количество  функций SQL Server 2000 достаточно велико, и для удобства работы они разбиты на отдельные группы:

• функции просмотра конфигурации;

• функции для работы с курсорами;

функции работы с датой и временем;

• математические функции;

• функции метаданных;

• функции подсистемы безопасности;

• строковые функции;

• системные функции;

• статистические функции;

• функции для работы с типами данных image, text и ntext.

Многие системные функции начинаются с символов @@. Полноценная функция должна работать с параметрами, значения которых при ее вызове указываются в скобках после имени функции. Функция может и не иметь параметров. В этом случае при ее вызове нужно будет указывать пустые скобки. Некоторые функции Transact-SQL не используют скобки при их вызове. Такие функции скорее можно назвать глобальными переменными. Тем не менее, в документации они все же рассматриваются как функции.

 

2.7.2. Функции, определяемые пользователем

 

При работе с SQL Server 2000 пользователи могут создавать свои собственные функции. Такие функции называются определяемыми пользователями функциями (User-defined function). Эти функции являются ничем иным, как обычными объектами, базы данных, такими же, как и хранимые процедуры, триггеры, представления и т. д.

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

В SQL Server 2000 имеется несколько типов определяемых пользователем функций:

Scalar. Функции этого типа являются наиболее привычными. Функция Scalar может содержать множество команд, объединяемых конструкцией BEGIN...END в одно целое, и возвращает скалярное значение любого из типов данных, поддерживаемого SQL Server 2000, за исключением timestamp, text, ntext, image, table и cursor.

Inline. Функции этого типа всегда возвращают значения типа данных table, представляющие собой сложный набор данных. Кроме того, функция Inline может состоять всего из одной команды SELECT. Функпйи Inline существуют во многих языках программирования: Их особенностью является то, что код функции при выполнении программы вставляется непосредственно в исполняемый набор команд, т. е. происходит не вызов функций, а встраивание.

Multi-Scalar. Как и функции предыдущего типа, функции Multi-Scalar возвращают значение типа данных table. Однако в отличие от первых, функции рассматриваемого типа могут состоять более чем из одной команды, что дает возможность использовать в теле функции транзакции, курсоры, вызывать хранимые процедуры и т. д. Как и при работе с функциями Scalar при использовании более одной команды следует применять конструкцию BEGIN...END.

 

2.8. Вставка, удаление и изменение данных

 

Изначально целью любой системы управления базами данных является предоставление пользователям удобных и эффективных механизмов управления данными. Любая СУБД предоставляет пользователям инструменты для ввода, изменения, удаления и выборки данных. Остальные возможности, такие как репликация, резервное копирование, автоматическое администрирование, перенос данных и другие являются лишь дополнительными компонентами, обеспечивающими более эффективное решение все тех же задач ввода, изменения, удаления и выборки данных.

Своеобразным стандартом является язык SQL, различные модификации которого используются практически во всех современных СУБД для управления данными.

Задачи, которые можно решать с помошью Transact-SQL, довольно обширны. Управление данными — лишь часть этих задач, пусть даже большая.  SQL Server 2000 предлагает несколько различных механизмов управления данными. Например, вставка данных может выполняться не только средствами Transact-SQL, но и с помощью утилиты bcp.exe или служб трансформации данных (DTS, Data Transformation Services).

2.8.1.  Добавление строк

 

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

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

• Команда INSERT. Обеспечивает вставку одной или более строк в существующую таблицу на основе явно заданных значений или результата выборки данных.

Синтаксис:

       INSERT INTO <название таблицы> ([<Имя столбца>, ... ]) VALUES (<Значение>,...)
       INSERT INTO <название таблицы> SELECT <имя столбца>,... FROM <название таблицы>

• Команда SELECT...INTO. С ее помощью на основе результата выборки создается новая таблица, которая будет иметь структуру, необходимую для хранения выбранных данных, и содержать весь результат выборки.

Синтаксис:

SELECT <список полей> FROM <список таблиц> WHERE <условия>

 

2.8.2.  Изменение данных

 

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

Синтаксис команды UPDATE:

      UPDATE [top(x)] <объект> 
     SET <присваивание1 [, присваивание2, ...]> 
     [WHERE <условие>]
      [OPTION <хинт1 [, хинт2, ...]>]

· top(x) — команда выполнится только х раз

· <объект> — объект, над которым выполняется действие (таблица или представление(views))

· <присваивание> — присваивание, которое будет выполняться при каждом выполнении условия <условие>, или для каждой записи, если отсутствует раздел where

· <условие> — условие выполнения команды

· <хинт> — инструкция программе как исполнить запрос

 

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

 

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

Минимальный блок, который можно удалить из таблицы – это строка. Для удаления одной и более строк таблицы служит команда DELETE.

Синтаксис команды DELETE:

      DELETE FROM <Имя Таблицы> WHERE <Условие отбора записей>

2.9. Выборка данных

 

Для выборки данных в Transact-SQL существует команда SELECT, которая позволяет как делать простую выборку всех данных из одной таблицы текущей базы данных, так и выполнять сложные запросы одновременно к множеству таблиц различных баз данных, расположенных на нескольких серверах сети. В самом простейшем случае выборка данных производится с помощью команды:

SELECT * FROM table_name

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

Полный синтаксис команды SELECT следующий:

SELECT s e l e c t _ l i s t

[INTO new_table_] FROM table_source

[WHERE search_condition]

[GROUP BY group_by_expression]

[HAVING search_condition]

[UNION]

[ORDER BY order_expression [ASC I DESC]]

[COMPUTE compure_expression]

[FOR] [OPTION <query_hint>]

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

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

Раздел FROM. С помощью этого раздела указываются таблицы и представления, из которых будет производиться выборка данных. При этом все таблицы и представления, участвующие в выборке данных, должны быть указаны в разделе FROM. Кроме того, даже если ни один из столбцов таблицы не включен в результат выборки, но используется в разделе WHERE, ORDER BY, GROUP BY или других, то имя этой таблицы также должно быть указано в разделе FROM.

Раздел WHERE. Этот раздел предназначен для ограничения количества строк, включаемых в результат выборки. Будут включены только те строки, которые удовлетворяют указанному логическому условию.

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

Раздел HAVING. Этот раздел обычно используется совместно с разделом GROUP BY, дополняя его. Назначением раздела HAVING является ограничение набора строк, подвергаемых группировке.

Раздел UNION. С помощью раздела UNION выполняется объединение строк двух таблиц в один массив строк.

Раздел ORDER BY. Для выполнения сортировки данных, возвращаемых запросом, в распоряжении пользователей имеется раздел ORDER BY, специально предназначенный для определения параметров порядка вывода строк.

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

Раздел FOR. Этот раздел применяется только в приложениях, работающих с DB-Library, а также при работе с XML.

Раздел OPTION. Раздел OPTION предназначен для контроля хода выполнения запроса. С помощью специальных хинтов (hint) пользователь может установить тот или иной режим слияния, объединения или агрегирования данных, а также контролировать некоторые другие тонкости выполнения запроса.

 

2.10.   Хранимые процедуры

 

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

 

2.10.1.   Системные хранимые процедуры

 

Чтобы обеспечить высокую безопасность выполняемых изменений, в SQL Server 2000 используются специальные системные хранимые процедуры (system stored procedure). Количество этих процедур составляет несколько сотен. Для удобства они разбиты на отдельные группы, каждая из которых предназначена для решения специфических задач. Например, имеются процедуры для управления системой репликации, процедуры для управления системой безопасности, процедуры для управления курсорами, процедуры для управления работой службы SQLServerAgent и некоторые другие.

Системные хранимые процедуры характеризуются тем, что они хранятся в системной базе данных Master и в своем названии имеют префикс sp, после которого следует символ подчеркивания и затем имя собственно процедуры.

 

2.10.2.   Расширенные хранимые процедуры

 

Расширенные хранимые процедуры (extended stored procedure) по своей природе коренным образом отличаются от системных и пользовательских хранимых процедур. Хотя вызов этих процедур и выполняется подобно другим процедурам, тем не менее, они представляют собой динамически подключаемые библиотеки (файлы dll). To есть расширенные хранимые процедуры представляют собой отдельные программы, которые в операционной системе могут играть роль самостоятельного приложения. Расширенные хранимые процедуры имеют префикс хр.

В SQL Server 2000 имеется набор встроенных расширенных хранимых процедур, в частности используемых для отправки сообщений по электронной почте и для трассировки обращений к SQL Server 2000. Пользователи могут создавать новые хранимые процедуры с помощью любого языка, допускающего создание библиотек. При этом они должны использовать интерфейс программирования SQL Server Open Data Services API. Готовую библиотеку необходимо зарегистрировать в SQL Server 2000, после чего пользователи смогут применять реализованные в ней функции. Регистрация библиотеки производится при помощи хранимой процедуры sp_addextendedproc, имеющей следующий синтаксис:

sp_addextendedproc (Sfunctname =] 'procedure', [Sdllname =] ' d l l'

Параметр Sfunctname определяет имя, по которому будет вызываться функция. Можно использовать любое имя, в том числе и с префиксом sp или хр. Однако это необязательно. Параметр @dllname задает путь к нужному dll-файлу. Регистрация расширенных хранимых процедур должна выполняться в контексте базы данных Master.

 

2.10.3.   Создание хранимой процедуры

 

В SQL Server 2000 имеется специальное право доступа — EXECUTE, с помощью которого можно разрешить пользователю или роли базы данных выполнять указанную процедуру.

Создание хранимой процедуры производится с помощью команды CREATE PROCEDURE, имеющей следующий синтаксис:

CREATE PROCEDURE] procedure_name [;number]

[ {@parameter d a t a _ t y p e ) [VARYING] [= d e f a u l t ] [OUTPUT] ]

[ , . . . n ] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ]

[FOR REPLICATION]

AS s q l _ s t a t e m e n t [ . . . n ]

Рассмотрим назначение и использование параметров команды:

procedure_name. С помощью этого параметра указывается имя, которое будет иметь хранимая процедура.

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

Sparameter. С помощью этого аргумента для хранимой процедуры указываются входные параметры.

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

VARYING. Это ключевое слово используется только для параметров хранимой процедуры, имеющих тип данных cursor. Использование VARYING необходимо, когда в хранимой процедуре происходит создание динамического курсора и полученные данные нужно возвратить из процедуры для дальнейшего использования.

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

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

WITH. После этого ключевого слова приводятся дополнительные опции хранимой процедуры. Рассмотрим их:

RECOMPILE. Использование этого параметра предписывает не выполнять кэширование плана выполнения хранимой процедуры. То есть всякий раз при вызове процедуры будет происходить генерирование плана обработки запроса. В обычных ситуациях использование этого параметра не рекомендуется.

ENCRYPTION. При указании данного параметра происходит шифрование кода процедуры в таблице syscomments, где хранится исходный текст процедуры. Если разработанный алгоритм является коммерческой тайной, то использование шифрования позволит сохранить в тайне код процедуры.

FOR REPLICATION. Этот параметр применяется только при выполнении репликации хранимых процедур. Указанный тип репликации позволяет передавать от издателя к подписчикам не весь набор выполненных изменений, и лишь вызов хранимой процедуры со значениями всех входных параметров. Таким образом можно резко снизить объем сетевого трафика. Хранимая процедура, созданная на подписчике с использованием FOR REPLICATION, не может быть вызвана пользователем. Ее запуск разрешен только подсистеме репликации.

AS. После этого ключевого слова начинается тело хранимой процедуры, которое содержит набор команд Transact-SQL.

sql_statement [...п]. Этот параметр подразумевает указание собственно команд Transact-SQL, из которых и формируется тело хранимой процедуры. В теле процедуры могут присутствовать вызовы других процедур, команды создания, фиксирования и отката транзакций, команды создания объектов базы данных, команды управления данными и т. д.

 

 

 

2.10.4 Удаление хранимых процедур

 

Процедура может быть удалена при выполнении изменений или просто из-за ненадобности. Для удаления хранимых процедур используется следующая команда:

DROP PROCEDURE {procedure} [ , . . . n ]

С помощью одной команды DROP PROCEDURE МОЖНО удалить множество процедур. Удаление процедуры включает удаление из системной таблицы sysobjects строки с информацией о хранимой процедуре, а также удаление из таблицы syscomments собственно кода хранимой процедуры. Так как SQL Server 2000 не позволяет восстанавливать удаленные строки таблиц, то нельзя будет и восстановить хранимую процедуру после удаления. При необходимости можно изменить имя процедуры, добавив префикс, по которому можно было сразу же определить, что процедура не используется и может быть удалена.

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

 

2.11.   Использование курсоров

 

Механизмом, обеспечивающим хранение результата выборки на сервере и предоставляющим пользователю возможность доступа к любой строке выборки по ее номеру, являются курсоры (cursors). Курсор представляет своего рода окно, накладываемое на результат выборки. Пользователь может работать в каждый момент времени только с одной строкой, но, перемещая окно, он способен получить доступ к любой строке выборки. Исходный набор данных, к которому обращается пользователь, называется полным набором строк (complete set of rows). В результате выполнения запроса SELECT пользователю возвращается набор данных, называемый результирующим набором (resulting set). Результирующий набор формируется в результате применения к полному набору строк горизонтального и вертикального фильтров. Горизонтальная фильтрация выполняется с помощью указания одного или более логических условий в разделе WHERE. Вертикальная же фильтрация подразумевает включение в результирующий набор не всех столбцов исходного набора данных. Горизонтальная и вертикальная фильтрации могут использоваться как по отдельности, так и вместе. Курсоры SQL Server 2000 работают с результирующим набором, предлагая пользователям дополнительные средства по его обработке.

При создании курсора пользователь указывает запрос SELECT, на основе которого создается результирующий набор данных. Аналогично  формируется и представление. Однако с представлением пользователь работает как с обычной таблицей, используя стандартные команды обработки данных — SELECT, INSERT, UPDATE и DELETE. При этом сервер обращается ко всем строкам результирующего набора (если не указано условие в разделе WHERE). При работе с курсорами в каждый момент времени пользователь может работать только с одной строкой. Каждая команда работы с данными курсора оперирует лишь с одной строкой результирующего набора.

Во многих языках программирования позволяют обращаться к произвольным элементам результирующего набора. То есть, получив в ответ на запрос SELECT от сервера результирующий набор, приложение автоматически формирует набор строк (record set), который позволяет пользователям обращаться к отдельной строке результирующего набора в произвольном порядке. Возможно, при формировании раскрывающегося списка этот подход будет более предпочтителен. Однако в этом случае весь набор данных хранится на клиенте. Использование курсоров SQL Server 2000 дает преимущества, когда обработка данных большей частью происходит на сервере, а не на клиенте. То есть приложение формирует на сервере набор данных, после чего отправляет запросы, обращающиеся к этому набору данных. В ответ может передаваться только результат обработки данных, размер которого значительно меньше объема всего результирующего набора.

Операции обработки данных с использованием курсоров выполняются заметно медленнее обычных команд обработки данных и не позволяют работать со всеми строками одновременно. Поэтому всегда, когда это возможно, следует избегать применения курсоров и пользоваться командами SELECT, UPDATE, INSERT И DELETE.

 

2.11.1.   Виды курсоров

 

По месту хранения и принципам работы курсоры классифицируются следую- щим образом:

Курсоры Transact-SQL (Transact-SQL Cursors). Создание курсоров этого типа и работа с ними ведется средствами команд Transact-SQL. Эти курсоры создаются на сервере. Интенсивное применение курсоров может потребовать

использования дополнительной оперативной памяти для хранения данных

курсоров. Курсоры Transact-SQL могут создаваться и работать в транзакциях,

хранимых процедурах и триггерах.

• Курсоры API сервера (API Server Cursors). Этот тип курсоров используется приложениями при работе с различными механизмами доступа к данным (ODBC, OLE DB, DB Library и т. д.)- Используя соответствующий API, клиент выполняет команду создания курсора. API сервера принимает запрос и создает на сервере курсор Transact-SQL. Работа с этим курсором выполняется средствами API, реализующего все базовые операции с курсорами и, возможно, некоторые дополнительные операции. Как и в случае с курсорами Transact-SQL, при действиях с курсорами API сервера данные хранятся на сервере.

Курсоры клиента (Client Cursors). Этот тип курсоров создается непосредственно на клиенте. Сервер обрабатывает отправленный клиентом запрос и возвращает ему результирующий набор. Клиент получает весь результирующий набор и уже сам организует нужные механизмы доступа к данным. Такой подход весьма удобен при работе с небольшим набором данных, т. к. позволяет повысить производительность за счет уменьшения количества обращений к сети, требующих определенного времени на обработку. Однако при работе с большими наборами данных каждый из клиентов должен иметь необходимый объем оперативной памяти.

Формирование содержимого курсоров происходит на основе результата, возвращаемого после выполнения запроса SELECT. Это позволяет в одном курсоре работать с данными, находящимися в разных таблицах. Кроме того, помимо отображения в курсоре непосредственно данных столбцов исходных таблиц, также допускается использование различных выражений, построенных с использованием функций, констант, имен столбцов и т. д. Также существуют так называемые блочные курсоры, позволяющие за одну операцию обращаться сразу к нескольким строкам результирующего набора. Однако курсоры этого типа являются своего рода расширением стандартного курсора. В SQL Server 2000 блочные курсоры могут создаваться средствами ODBC, OLE DB, ADO или DB Library. Однако создание блочных курсоров средствами Transact-SQL не поддерживается.

По способу обращения к данным курсоры можно разделить на две следующие категории:

Последовательные (Forward-only). Этот тип курсоров разрешает только последовательное считывание строк, начиная с первой строки и заканчивая последней. После выполнения команды выборки сервер автоматически перемещает указатель на следующую строку. Сам пользователь не может управлять ходом выборки строк — например, считать предыдущую строку или строку через две после текущей. Последовательные курсоры, хотя и обладают ограниченной функциональностью, работают быстрее прокручиваемых курсоров.

• Прокручиваемые (Scrollable). В отличие от последовательных курсоров, курсоры этого типа позволяют обращаться к произвольной строке результирующего набора. В распоряжении пользователей имеются средства как последовательного обращения к строкам курсора, так и средства работы со строками по их порядковому номеру в результирующем наборе. Направление перебора строк при последовательном обращении может быть не только прямым (от первой строки к последней), но и обратным (от последней к первой). Кроме того, можно в произвольном порядке комбинировать команды последовательного и произвольного обращения к строкам курсора.

 

2.11.2.   Курсоры Transact-SQL

 

Статические курсоры. При создании статического курсора (static cursor), или как его еще называют, курсора моментального снимка (snapshot cursor) сервер сохраняет полученные данные в системной базе данных, используемой для временного хранения данных. При работе с курсором сервер обращается не к данным исходных таблиц, а к данным, сохраненным в базе данных Tempdb. Таким образом, в распоряжении пользователя имеется копия исходных данных (моментальный снимок). Во время создания статического курсора сервер блокирует все данные, удовлетворяющие критериям выборки. На момент формирования курсора ни одна транзакция не может изменить даже одну строку, входящую в курсор. Таким образом и получается моментальный снимок. Пользователи могут обращаться к произвольным строкам результирующего набора, на основе которого построен статический курсор.

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

Природа статического курсора не позволяет выполнять изменения отображаемых в нем данных. Это связано с тем, что нет никакой гарантии в существовании строк, включенных в курсор, а также в том, что эти строки не претерпели изменений. Поэтому статические курсоры всегда открываются в режиме "только для чтения"(read only). Статические курсоры весьма полезны при работе с данными, зависящими друг от друга.

Ключевые курсоры. Курсоры, базирующиеся на наборе ключей (keyset driven cursors) или ключевые курсоры, представляют собой набор ссылок на строки, которые удовлетворяют условиям горизонтальной фильтрации, указанным при создании курсора в разделе WHERE запроса SELECT. TO есть, в отличие от статического курсора, ключевые курсоры выбирают не всю строку, а лишь ключевые поля, позволяющие однозначно идентифицировать каждую строку результирующего набора в полном наборе. Полученный набор уникальных ссылок называется набором ключей (keyset). Таким образом, результирующий набор физически является ничем иным, как набором ключей. Пользователи могут обращаться к произвольным строкам результирующего набора. При обращении к строке курсора сервер находит в наборе ключей нужный идентификатор и выбирает данные непосредственно из полного набора данных. Такой подход позволяет отображать в курсоре любые изменения, сделанные в исходном наборе данных. Однако набор ключей формируется только в момент открытия курсора и впоследствии не изменяется. Если в исходные таблицы были добавлены новые строки, удовлетворяющие условиям горизонтальной фильтрации курсора, то такие строки не будут отображены в курсоре. Кроме того, пользователи могут удалить строки, входящие в результирующий набор курсора. Такие строки показываются в курсоре как поврежденные (row missing). К аналогичному результату приведет и изменение значений в ключевых столбцах. Кроме того, если при создании курсора использовались логические условия

(раздел WHERE) ДЛЯ ограничения диапазона строк, входящих в результирующий набор, то если пользователи изменят строки таким образом, что они не будут удовлетворять условиям горизонтальной фильтрации, то эти строки все равно станут обрабатываться курсором. Это является следствием того, что набор ключей формируется при открытии курсора и в дальнейшем не изменяется.

Последовательные курсоры. Если предполагается произвести лишь одиночное последовательное сканирование всех строк курсора, то рекомендуется использовать специально для этого предназначенные последовательные курсоры (forward-only cursors). Этот тип курсоров поддерживает только обращение к следующей строке курсора и не позволяет вернуться к любой из ранее выбранных строк. Кроме того, не разрешается перескакивать через одну или более строк. Таким образом, пользователи могут перебирать одну строку за другой, начиная с первой и заканчивая последней. При создании последовательного курсора сервер не сохраняет значений ключей или копий строк. Сервер оперирует лишь запросом SELECT и номером текущей строки. При считывании следующей строки сервер выполняет поиск в исходных таблицах следующей после текущей строки, удовлетворяющей условиям горизонтальной фильтрации. Такой подход позволяет отображать в курсоре все изменения, выполненные в результирующем наборе другими пользователями. Кроме того, при работе с последовательными курсорами минимальны требования к объему оперативной памяти. Независимо от количества строк, доступных в курсоре, объем необходимой памяти для работы с последовательными курсорами будет всегда примерно одинаков.

Динамические курсоры. Динамические курсоры (dynamic cursors) используют тот же принцип обращения к данным, что и последовательные, однако позволяют обращаться к любой произвольной строке результирующего набора. По способу доступа к данным и отображению в результирующем наборе изменений, сделанных другими пользователями, динамические курсоры напоминают ключевые курсоры. Однако между этими типами имеется одно существенное различие.

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

Природа же динамических курсоров такова, что при каждом обращении к строкам сервер заново обрабатывает ассоциированный с курсором запрос SELECT, обновляя тем самым результирующий набор. Если в исходный набор данных пользователями были внесены изменения, влияющие на список строк результирующего набора, то такие изменения будут автоматически отражены в курсоре. При использовании динамических курсоров пользователь гарантированно работает со строками, удовлетворяющими условиям горизонтальной фильтрации курсора. При работе с динамическими курсорами пользователи могут выполнять с помощью них изменения данных в исходных таблицах. Для этого предназначены команды UPDATE, INSERT и DELETE. Однако каждая такая команда за один раз может работать только с одной строкой. Во время выполнения выборки или изменений данных с помощью курсора SQL Server 2000 блокирует соответствующим образом нужную строку. При чтении данных с помощью курсора другие пользователи не смогут изменить данные, читаемые в курсоре. Если же в курсоре производится изменение данных, то другие пользователи не смогут даже прочитать эти данные. Такой подход полностью соответствует требованиям ACID.

 

2.11.3.   Работа с курсорами

 

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

Весь процесс использования курсора можно разбить на пять этапов:

Объявление курсора (declare cursor). Прежде чем выполнить любую операцию с курсором, его необходимо объявить. Объявление курсора можно сравнить с объявлением переменной или созданием таблицы. Объявление курсора подразумевает указание его имени и запроса SELECT, который будет использоваться для формирования результирующего набора. При объявлении курсора также указывает его тип. Объявление курсора выполняется с помощью команды DECLARE CURSOR.

Открытие курсора (open cursor). Сразу же после создания курсор не содержит никаких данных, так же как и после создания таблице в ней нет никаких данных. В процессе открытия курсора выполняется ассоциированный с курсором запрос SELECT. Если создается статический курсор, то сервер будет копировать весь полученный результат в системную базу данных Tempdb. При работе с ключевым курсором в базу данных Tempdb будет помещен только набор ключей. Открытие курсора производится с помощью команды OPEN.

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

Закрытие курсора (close cursor). После того, как из курсора были получены все интересующие данные и выполнены все необходимые изменения, его можно закрыть. Закрытие курсора подразумевает освобождение выделенного для него пространства в системной базе данных Tempdb. После закрытия курсора пользователь не сможет обратиться ни к одной строке. Закрытие курсора выполняется с помощью команды CLOSE.

Освобождение курсора (release cursor). Закрытый курсор может быть удален. Удаление курсора подразумевает удаление из оперативной памяти описания курсора как объекта. Если курсор закрыт, но не удален, он может быть повторно открыт для использования. При этом в него будет помещен новый набор строк. Можно удалить только закрытый курсор. Для освобождения курсора используется команда DEALLOCATE.

 

2.12.   Триггеры

 

2.12.1. Использование триггеров

 

Триггеры (triggers) SQL Server 2000 представляют собой набор команд Transact-SQL, выполняемых автоматически при осуществлении тех или иных модификаций данных в таблице. Физически триггеры являются ни чем иным, как хранимыми процедурами специального типа. Каждый триггер связан с конкретной таблицей и запускается сервером автоматически каждый раз, когда пользователи пытаются произвести вставку, изменение или удаление данных. Триггер получает всю информацию о выполняемых пользователем изменениях в таблице. Разработчик реализовывает в триггере необходимые проверки и изменения данных в других таблицах базы данных. Когда пользователь начинает изменение данных, сервер автоматически начинает

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

Существует несколько типов триггеров, каждый из которых реагирует на определенный тип изменений данных. В SQL Server 2000 существует три типа триггеров, классифицирующихся по названию команд, на которые они реагируют:

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

UPDATE TRIGGER. Этот тип триггеров выполняется при изменении данных с помощью команды UPDATE.

DELETE TRIGGER. Этот тип триггеров выполняется при удалении данных с помощью команды DELETE.

Помимо классификации триггеров по типу операции, на которую они реагируют, они также различаются по поведению:

 AFTER. Это стандартный тип триггеров, активно используемый в предыдущих версиях SQL Server. По умолчанию триггер SQL Server 2000 имеет именно этот тип.

•  INSTEAD OF. Триггеры этого типа выполняются взамен пользовательских действий. То есть запрос пользователя не выполняется, а вносятся лишь изменения, осуществляемые в теле триггера. Для одной таблицы допускается создавать множество, триггеров каждого типа. Это позволяет реализовывать сложные многоуровневые механизмы контроля целостности данных. Теперь разработчик может не создавать один большой триггер, включающий множество проверок, а организовать несколько небольших триггеров, каждый из которых выполняет отдельную проверку.

Триггеры весьма широко используются при разработке промышленных систем. Область их применения достаточно широка и не ограничивается какими-то строгими рамками.

Разработчики могут использовать триггеры для решения самых  разнообразных задач. Однако выполнение триггеров является довольно "тяжелой" задачей и по возможности нужно избегать их использования. Если задачу можно решить на уровне ограничений целостности, пакета или хранимой процедуры, то так и следует сделать. Триггеры можно использовать лишь тогда, когда они дают значительный выигрыш функциональности и предлагают значительные удобства для пользователей.

 

2.12.2. Создание триггера

 

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

Для создания триггера используется команда CREATE TRIGGER, имеющая синтаксис:

CREATE TRIGGER trigger_name

ON {table I view} [WITH ENCRYPTION]

{ { FOR [{ AFTER | INSTEAD OF }]

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

' AS

[ { IF UPDATE (column)

[ { AND | OR ) UPDATE (column) ]

[ ...П ] I IF (COLUMNS_UPDATED()

{ bitwise_operator ) updated_bitmask )

( comparison_operator } column_bitmask [ ...n ] } ]

sql statement [ .. . n ] }

Рассмотрим назначение и использование параметров команды:

trigger_name. Этот параметр подразумевает указание имени триггера. При выборе имени нужно следовать стандартным правилам именования объектов SQL Server 2000. При необходимости имя триггера может быть заключено в ограничители.

{ table I view }. Имя таблицы или представления текущей базы данных, к которой будет привязан триггер.

WITH ENCRYPTION. При указании этой опции сервер будет выполнять шифрование кода, используемого для создания триггера.

• FOR. После этого ключевого слова указывается тип создаваемого триггера. Допустимы варианты:

AFTER. Будет создан стандартный триггер. Если не указано ни AFTER, ни INSTEAD OF, то по умолчанию используется AFTER.

INSTEAD OF. Создаваемый триггер будет выполняться взамен команды, приведшей к запуску триггера.

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

INSERT. Создаваемый триггер будет вызываться при попытке добавления в указанную таблицу новых строк с помощью команды.

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

WITH APPEND. Использование этой опции необходимо только для баз данных, имеющих уровень совместимости (compatibility level) ниже чем 70, т. е. база данных работает в режиме SQL Server 6.x, допускающем создание в каждой таблице всего одного триггера.

NOT FOR REPLICATION. При указании этой опции триггер не будет вызываться, если модификация данных (вставка, изменение или удаление) производится средствами подсистемы репликации.

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

IF UPDATE (column). С помощью этой конструкции можно разрешить выполнение триггера только при осуществлении изменений в определенном столбце таблицы.

IF (COLUMNS J J P D A T E D О . . . ). Эта конструкция является вторым способом выполнения проверки изменений определенных столбцов.  Функция COLUMNS JJPDATEDо возвращает двоичное значение, каждый бит которого соответствует одному столбцу. Рассмотрим параметры, применяемые для проверки изменения нужных столбцов:

bitwiseoperator. Этот параметр подразумевает указание оператора побитовой обработки. Возвращаемое функцией COLUMNS JJPDATEDо двоичное значение подвергается дополнительной обработке для выделения из него флагов изменения отдельных столбцов.

updated_bitmask. Этот параметр подразумевает указание константы, определяющей маску анализа изменяемости столбцов.

column_bitmask. Этот параметр подразумевает указание битовой маски столбцов, с которой будет сравниваться значение, полученное после выполнения выражения (COLUMNSJJPDATEDO {bitwise_operator} updated^bitmask).

• [.. .п]. Этот параметр говорит о том, что можно использовать множество проверок на то, какие столбцы были изменены.

• sql_statement [...п]. Этот параметр подразумевает указание команд Transact-SQL, которые будут выполняться при вызове триггера. Могут применяться команды цикла, выборки данных, изменения, вставки и удаления строк. Внутри триггера также можно создавать транзакции.

 

2.12.3. Удаление триггера

 

Если триггер больше не нужен или, более того, начал мешать нормальной работе, то его можно удалить.

Для этого используется команда Transact-SQL:

DROP TRIGGER { t r i g g e r } [ , . . . n ]

Единственный параметр этой команды, trigger, определяет имя триггера, который необходимо удалить. С помощью одной команды DROP TRIGGER можно удалить множество триггеров, перечислив их через запятую.

Правом удаления триггера обладает владелец таблицы, к которой относится

триггер, а также все члены фиксированных ролей базы данных dbowner и db_ddladmin.

 

 

 

3.   ИНТЕРНЕТ-СИСТЕМА КЛАССИФИКАТОРЫ

3.1. Перечень классификаторов

 

Общероссийские классификаторы

  • ОКАТО,Общероссийский классификатор объектов административно-территориального деления (ОК 019-95)
  • ОКВЭД,Общероссийский классификатор видов экономической деятельности (ОК 029-2001 (КДЕС Ред. 1))
  • ОКДП,Общероссийский классификатор видов экономической деятельности, продукции и услуг (ОК 004-93)
  • ОКЕИ,Общероссийский классификатор единиц измерения (ОК 015-94 (МК 002-97))
  • ОКОГУ,Общероссийский классификатор органов государственной власти и управления (ОК 006-93)
  • ОКОК,Общероссийский классификатор информации об общероссийских классификаторах (ОК 026-2002)
  • ОКОПФ,Общероссийский классификатор организационно-правовых форм (ОК 028-99)
  • ОКОФ,Общероссийский классификатор основных фондов (ОК 013 - 94)
  • ОКП,Общероссийский классификатор продукции (ОК 005-93)
  • ОКС,Общероссийский классификатор стандартов (ОК (МК (ИСО/ИНФКО МКС ) 001-96) 001-2000)
  • ОКСМ,Общероссийский классификатор стран мира (ОК (МК (ИСО 3166) 004-97) 025-2001)
  • ОКСО,Общероссийский классификатор специальностей по образованию (ОК 009-2003)
  • ОКУД,Общероссийский классификатор управленческой документации (ОК 011-93)
  • ОКФС,Общероссийский классификатор форм собственности (ОК 027-99)
  • ОКЭР,Общероссийский классификатор экономических регионов (ОК 024-95)
  • ТНВЭД СНГ,товарная номенклатура внешнеэкономической деятельности СНГ

Справочники ГМЦ

  • Справочник единиц измерения (EИ)
  • Справочник признаков принадлежности к госсектору (ГС)
  • Справочник каналов реализации
  • Справочник категорий хозяйств
  • Справочник животноводческих комплексов
  • Справочник показателей (КНП)
  • Справочник кормов
  • Справочник местностей
  • Справочник направлений продажи/покупки
  • Справочник направлений использования зерна
  • Cправочник форм
  • Справочник стран мира (ОКСМ)
  • Справочник видов деятельности (ОКВЭД)
  • Справочник посевных площадей
  • Характеристика прибыльности предприятия
  • Справочник продукции
  • Справочник субсидий
  • Справочник типов свода (TYP)
  • Cправочник видов ОКВЭД (vid)
  • Справочник видов проданных товаров, работ, услуг
  • Справочник сооружений
  • Справочник удобрений
  • Характеристика приусадебного участка
  • Структура затрат

Ведомственные справочники

  • Справочник возраста работника
  • Возраст рыбы и животных
  • Виды агрохимических работ
  • Результаты аттестации руководителя
  • Кредитующие организации
  • Целевые программы
  • Справочник сельскохозяйственной техники
  • Длительность договора кредитования
  • Договоры по годам их заключения
  • Справочник эксплуатационных характеристик почвы
  • Справочник параметров загрязнения почвы
  • Справочник образования специалистов
  • Единицы Измерения
  • Справочник параметров почвенного плодородия
  • Бюджетный источник финансирования
  • Справочник категорий рыбных хозяйств
  • Этапность выполнения работ
  • Классификатор охотничьих животных
  • Справочник качества зерновых культур
  • Справочник с классификатором должностей
  • Категории молодых жителей села
  • Машины и оборудование
  • Цель кредитования
  • Процессы в АПК
  • Объекты наблюдения
  • Наименование продукции промышленного рыбоводства
  • Дата начала периода наблюдения
  • Подрядные организации
  • Периодичность представления данных
  • Продолжительность периода наблюдения
  • Провайдеры данных
  • Справочник продолжительности обучения
  • Основание показателя
  • Продукция
  • Регион(Территории из ОКАТО для Нац. проекта)
  • Животные и птицы
  • Стаж работы в должности
  • Пол людей и животных
  • Движение денежных средств(31.03.08 Нац2,НП22)
  • Сортность продукции
  • Сельскохозяйственные предприятия()
  • Страна происхождения товара (услуги)
  • Справочник со структурой производства в АПК
  • Справочник со структурой управления в АПК
  • План-факт
  • Виды финансирования
  • Вариант обобщения информации
  • Удобрения
  • Справочник Видов почвенных угодий
  • Виды выполняемых работ МТС
  • Вид учета охотничьих животных
  • Животные и птица по категориям упитанности
  • Справочник категорий хозяйств
  • Справочник местностей
  • Справочник территорий (ОКАТО)
  • Справочник форм собственности (ОКФС)
  • Справочник организационно-правовых форм (ОКОПФ)
  • Справочник номенклатуры изделий (ОКП)
  • Целевые программы, с признаками
  • Основание показателя, с признаками
  • Запланированная периодичность поступления форм отчета
  • Провайдеры данных, с признаками
  • Движение денежных средств, иерархический, с признаками
  • План факт, с признаками
  • Вариант обобщения информации, с признаками
  • Типы деятельности в АПК, иерархический, с признаками суммирования
  • Кредитующие организации, иерархический, с признаками суммирования
  • Длительность договора кредитования, иерархический, с признаками суммирования
  • Источник финансирования, иерархический, с признаками суммирования
  • Категории молодый семей и молодых специалистов села, иерархический, с признаками суммирования
  • Направления привлечения кредитов, иерархический, с признаками суммирования
  • Средний надел земли сельхозпредприятия, иерархический, с признаками суммирования
  • Сельскохозяйственные предприятия, иерархический, с признаками суммирования
  • Направления субсидирования расходов бюджета, иерархический, с признаками суммирования
  • Цели кредитования, иерархический, с признаками суммирования

Межведомственные классификаторы

  • Общероссийский классификатор объектов административно-территориального деления (ОК 019-95)
  • Общероссийский классификатор продукции (ОК 005-93)

 

3.2. Предлагаемая схема БД для  реализации системы ведения справочников

Рис 3.1.

Каждый справочник состоит из трех таблиц. Objects, ObjectsBody, ObjectsExt_N.

Таблицы Objects, ObjectsBody для всех справочников общие, таблица ObjectsExt_N для кадого справочника индивидуальна.

Таблицы ObjectsDescription, ObjectsStructure является служебной и используется для описания справочника и структуры соответствующей таблицы ObjectsExt_N.

 

3.3. Назначение и структура таблиц

 

Таблица Objects

 

Основная таблица системы ведения справочников. Используется для реализации иерархической структуры справочников и создания ссылочных связей между элементами разных справочников.

Поля:

ID – внутренний идентификатор элемента справочника. Автонумеруемое поле.

ParentID – идентификатор родительского элемента. Для первого элемента (корня) справочника равно null.

GroupCode – строка, содержащая последовательное перечисление идентификаторов родительских объектов, преобразованных к строке. Используется для удобных выборок в иерархической структуре. Каждый идентификатор преобразуется в 4-х символьную строку.

Пример:

ID

ParentID

GroupCode

Комментарий

1633837924

null

 

Корневой элемент

1095976005

1633837924

abcd

Элемент 1-го уровня

1935959653

1633837924

abcd

Элемент 1-го уровня

1095976005

1935959653

abcdsdfe

Элемент 2-го уровня, родитель: 1935959653

Таблица 3.1.

 

Уровень элемента вычисляется как LEN(GroupCode)/4. Все дочерние элементы текущего находятся как: where GroupCode like @CurentGroupCode + int2char4(@CurentID) + ‘%’, где @CurentGroupCode – GroupCode текущего элемента, @CurentID – ID текущего элемента, int2char4 – функция преобразования идентификатора в 4-х сивольную строку.

Поле GroupCode заполняется автоматически (триггером) в момент создания или изменения элемента справочника.

OwnerID – идентификактор «основного» элемента. Используется для реализации одних справочников на основе других. Т.е. элемент с заполненным OwnerID повторяет по структуре соответствующий элемент с ID, равным этому OwnerID. Например на основе справочника OKATO делается справочник регионов, содержащий некоторую выборку из основного справочника. При изменении элементов «основного» справочника также меняются элементы «подчиненного» справочника.

DataNumber – номер таблицы расширений. Для корневого элемента присваивается автоматически при создании, для дочерни элементов наследуется от родителя.

UserID – идентификатор пользователя БД, создавший или изменивший данный элемент справочника.

CreateDate – дата и время создания элемента справочника(заполняется автоматически).

ModifyDate – дата и время изменения элемента справочника(заполняется автоматически).

 

 

Таблица ObjectsBody

 

Основная таблица системы ведения справочников. Используется для фиксации изменений во времени элементов справочника. Связана с таблицей Objects в отношении много к одному.

Поля:

ID – внутренний идентификатор элемента справочника. Автонумеруемое поле.

ObjectID – идентификатор элемента из таблицы Objects.

Code – код элемента справочника.

Name – наименование элемента справочника.

Date0 – дата начала действия. Для первого элемента справочника равна null.

Date1 – дата начала действия. Для последнего элемента справочника равна null.

При изменении кода, наименования или других атрибутов элемента справочника из таблицы ObjectsExt_N не происходит замещения существующих значений новыми. У существующего последнего элемента таблицы ObjectsBody изменяется поле Date1 на значение текущей даты минус 1 секунда и добавляется новый элемент в таблицу ObjectsBody со значением в поле Date0, равным текущей дате и Date1, равным null. В таблицу ObjectsExt_N также делается новая запись.

UserID – идентификатор пользователя БД, создавший или изменивший данный элемент справочника.

CreateDate – дата и время создания элемента справочника(заполняется автоматически).

ModifyDate – дата и время изменения элемента справочника(заполняется автоматически).

 

Таблица ObjectsExt_N

 

Группа таблиц, имеющая индивидуальную структуру для каждого вида справочника. Структура каждой таблицы ObjectsExt_N описана в ObjectsStructure. N – номер таблицы расширений из поля DataNumber таблицы Objects. Таблицы ObjectsExt_N связаны с таблицей ObjectsBody в отношении один к  одному. Таблица ObjectsExt_N создается автоматически на основе данных таблицы ObjectsStructure при создании нового корневого элемента в таблице Objects.

Обязательные поля:

ID – ссылка на поле ID таблицы ObjectsBody.

В таблицах ObjectsExt_N может реализовано автоматическое заполнение полей на основе значений других полей или на основе других элементов справочников.

 

Таблица ObjectsDescription

 

DataNumber – номер таблицы ObjectsExt_N.

Code – Код справочника(совпадает с кодом корневого элемента).

Name – название справочника.

Description – описание справочника.

AllowModification – разрешение-запрет на модификацию элементов справочника пользователем.

 

Таблица ObjectsStructure

 

ID – внутренний идентификатор элемента.

DataNumber – номер таблицы ObjectsExt_N.

Sort – порядок сортировки полей в таблице ObjectsExt_N.

FieldName – название поля таблицы ObjectsExt_N.

FieldType – тип поля таблицы ObjectsExt_N.

FieldSize – размер поля таблицы ObjectsExt_N.

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

FieldDescr – описание поля таблицы ObjectsExt_N.

Visible – признак видимости поля в интерфейсе пользователя.

Link – признак ссылочного поля. Только для полей типа int. Если признак установлен, то поле является ссылкой на другой элемент справочника.(Например, для использования единиц измерения в других справочниках)

 

Пример таблицы ObjectsStructure для справочника ОКАТО:

ID

DataNumber

Sort

FieldName

FieldType

FieldDisplay

FieldDescr

Visible

Link

1

1

1

TER

char(2)

TER

NULL

0

NULL

2

1

2

KOD1

char(3)

KOD1

NULL

0

NULL

3

1

3

KOD2

char(3)

KOD2

NULL

0

NULL

4

1

4

KOD3

char(3)

KOD3

NULL

0

NULL

5

1

5

RAZDEL

tinyint(1)

RAZDEL

NULL

0

NULL

6

1

6

CENTRUM

varchar(80)

CENTRUM

NULL

0

NULL

7

1

7

NOMAKT

smallint(2)

NOMAKT

NULL

0

NULL

8

1

8

TYPEAKT

char(2)

TYPEAKT

NULL

0

NULL

9

1

9

DATAKT

smalldatetime(4)

DATAKT

NULL

0

NULL

10

1

10

lavel

tinyint(1)

lavel

NULL

0

NULL

11

1

11

rowguid

uniqueidentifier(16)

rowguid

NULL

0

NULL

Таблица 3.2.

 

3.4. Пользовательский интерфейс

Главная страница

На главной странице представлен перечень всех классификаторов и справочников.

Рис. 3.2.

Для авторизованного пользователя предусмотрены дополнительные функции, потому данная страница имеет следующий вид:

Рис. 3.3.

Добавление нового справочника

 

Рис. 3.4.

Необходимо выбрать Тип справочника из выпадающего списка, заполнить поля «Код», «Название» и «Описание», а так же по необходимости дополнительные поля справочника «Название поля», «Тип поля», «Размер», «Отображаемое название», «Описание поля», «Показывать», «Видимость», «Ссылка», «Значение по умолчанию». А затем нажать кнопку «Добавить». Кнопку «Очистить» необходимо использовать, если произошла ошибка заполнения полей.

Страница классификатора

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

Рис. 3.5.

Для авторизованного пользователя:

 

Рис. 3.6.

 

В левом фрэйме в виде дерева представлен состав классификатора. Выбранные пункты отображаются в правом фрэйме. Здесь же предусмотрены некоторые дополнительные функции, такие как : «Создать», «Изменить», «Удалить», «История изменений» и «Импорт».

 

Добавление нового объекта («Создать»)

 

Рис. 3.7.

 

Необходимо заполнить два обязательных поля : «Код» и «Название», а затем нажать кнопку «Добавить». Кнопку «Очистить» необходимо использовать, если произошла ошибка заполнения полей. Кнопка «Отмена» возвращает на страницу классификатора.

 

Изменение объекта («Изменить»)

 

Рис. 3.8.

 

Заполнение полей происходит аналогично разделу «Создать». Так же можно выбрать «С текущей даты» либо «Полностью» был изменен объект, эти изменения будут отражены в разделе «История изменений.

Удаление объекта («Удалить)

Рис. 3.9.

 

Заполнение полей происходит аналогично разделу «Изменить».

История изменений объекта(«История изменений»)

Рис. 3.10.

 

В данном разделе отображается история изменений объекта, которые могли происходить в разделах «Изменить» и «Удалить».

 

 

ЗАКЛЮЧЕНИЕ

 

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

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

Интернет-система Классификаторы была создана для Министерства сельского хозяйства Российской Федерации и на данный момент уже внедрена и имеет большое  количество пользователей по всей стране.

ВНИИ «АГРОСИСТЕМА» осуществляет информационное обслуживание заинтересованных организаций и инспекций Федеральной налоговой службы РФ по определению кодов классификационных группировок продукции  согласно уставным документам для определения кодов по Общероссийскому классификатору видов экономической деятельности.

 

 

 

 

 

 

 

 

 

СПИСОК ЛИТЕРАТУРЫ

1. Мамаев Е. MS SQL SERVER 2000 / Е.Мамаев. – Спб.: BHV-Санкт-Петербург, 2001. – 1280 с.

2. Дунаев В.В. Базы данных.Язык SQL / В.В.Дунаев. – Спб.: BHV-Санкт-Петербург, 2006.- 288 с.

3. Дунаев В.В. Самоучитель PHP / В.В.Дунаев. – Спб.: Питер, 2007. – 284 с.

4. Орлов А.А. PHP: Полезные приемы / А.А.Орлов. – М.: Горячая Линия – Телеком, 2003. – 224 c.

5. Хольцнер С. PHP в примера / С. Хольцнер; пер. с англ. Банникова С.Н. – М.: Бином, 2007. – 352 с.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИЛОЖЕНИЕ

 

Программный код Index.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

 

class HTML_Top {

  function Show($rows) {

  /*

  Разделение уровней доступа

  $AccessLevel

  1 - администратор - может все

  2 - Ответственный редактор - все, кроме создания пользователей

  4 - редактор - только добавление элементов

 

  */

  $AccessLevel = 2;

  global $isAdmin;

  global $cnConfig_sitename;

  menu::Show();

 

?>

 

 

    <form name="mainForm">

  <input name="task" type="hidden" value="">

  <input name="action" type="hidden" value="">

  <input name="node" type="hidden" value="<?php /* echo $node;*/ ?>">

  <div>

<a>На Главную</a>

<div>

<?php HTML_Top::makeborder();?>

<?php

if ( count($rows) ) {

echo '<div>

HTML_Top::makeborder();

$prev_class=$rows[0]['ClassID'];

?>

<div>

<ul>

<?php

}

?>

<?php

foreach ( $rows as $row ) {

if ( $prev_class!=$row['ClassID'] ) {

echo '</ul>';

echo '<div>

HTML_Top::makeborder();

$prev_class=$row['ClassID'];

?>

<div>

  <ul>

  <?php

 

}

 

echo "<li>";

if ( ($isAdmin & $AccessLevel) && $row['ClassID'] == 3 ) {

  echo "<input type='".($isAdmin?"radio":"hidden")."' id='cb" . $row['ID'] . "' name='id' value='" . $row['ID'] . "'/>";

}

if ( $row['Published'] == 0 ) {

    echo '<a>

  }

  else

  echo '<a>

}

?>

</ul>

</div>

<div>Методические материалы</div>

  <?php HTML_Top::makeborder();?>

<div>

<ul>

</ul>

</div>

  </div>

    </form>

 

<?php

  }

  function makeborder() {

  ?>

  <table>

<tr>

<td background="media/images/linebg.png"></td>

</tr>

  </table>

  <?php

  }

 

}

?>

 

 

 

Программниый код Rirht.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

 

class HTML {

 

  function Show($currentnode, $fields, $rows, $edittree) {

  global $isAdmin;

  /*формирование меню*/

  menu::Show();

  ?>

  <form name="mainForm" method="post">

  <input name="task" type="hidden" value="">

  <input name="action" type="hidden" value="">

  <input name="no_html" type="hidden" value="">

  <input name="node" type="hidden" value="<?php echo $currentnode->id;?>">

 

  <?php

  $tabhead = "

<table>

<tr>

<td>

<img src='media/images/openfolder.png' alt='curreent node'>

</td>

<td>

  $currentnode->Code : $currentnode->Name

  <td>

</tr>

  </table>

<table>

<tr>

<th nowrap='nowrap'>

 

</th>

<th nowrap='nowrap'>

 

</th>

<th nowrap='nowrap'>

  Код

</th>

<th nowrap='nowrap'>

  Наименование

</th>";

 

  foreach ( $fields as $row ) {

  $tabhead .= "<th nowrap='nowrap'>

  }

 

  $tabhead .= '</tr>';

  $k = 0;

    $tabbody = '';

  foreach ( $rows as $row ) {

  $mousover = "onmouseover='this.className=\"rowsl\";' onmouseout='this.className=\"row$k\";'";

if ( count($rows) > 1000 ) {

$mousover = "";

}

  $tabbody .= "<tr>

$i=1;

foreach($row as $fld) {

  if ( $i==1 ){ //Первая колонка. Нужно нарисовать лобо пусто, либо radio, либо check

 

$tabbody .= "<td>";

if ( $isAdmin && $edittree == 0 ) {

$tabbody .= "<input type='radio' id='cb$fld' name='id' value='$fld'/>";

 

}

elseif ( $isAdmin && $edittree == 1 ) {

  $tabbody .= "<input type='checkbox' id='cb$fld' name='id[]' value='$fld'/>";

}

else {

$tabbody .= "<input type='hidden' id='cb$fld' name='id' value='$fld'/>";

}

$tabbody .= "</td>";

$tabbody .= "<label for='cb$fld'>";

}

 

elseif ( $i==2 ){

$tabbody .= "<td>";

$tabbody .= "<img src='media/images/" . ($fld>0 ? "folder.png":"file.png") . "' alt='$fld объектов'>";

$tabbody .= "</td>";

}

else {

$tabbody .= '<td>'.$fld.'</td>';

}

$i++;

}

  $tabbody .= '</label>';

$tabbody .= '</tr>';

$k = 1 - $k;

  }

  echo $tabhead . $tabbody . '</tbody></table></form>';

 

 

  }

}

 

 

 

 

 

 

Программный код Left.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

class HTML_Left {

  function Show($rootName, $rootid, $edittree) {

  global $isAdmin;    ?>

  <form name="mainForm" method="post">

<input name="task" type="hidden" value="">

<input name="action" type="hidden" value="">

<input name="rootid" type="hidden" value="<?php echo $rootid;?>">

<input name="id" type="hidden" value="<?php echo $rootid;?>">

</form>   <script type="text/javascript" src="media/lib/xtree.js"></script>

  <script type="text/javascript" src="media/lib/xmlextras.js"></script>

  <script type="text/javascript" src="media/lib/xloadtree.js"></script>

  <div>

<a>

  </div>

  <?php

  /*формирование меню*/

  menu::Show();  ?>

  <script type="text/javascript">

  /// XP Look

  webFXTreeConfig.rootIcon   = "media/images/folder.png";

  webFXTreeConfig.openRootIcon   = "media/images/openfolder.png";

  webFXTreeConfig.folderIcon   = "media/images/folder.png";

  webFXTreeConfig.openFolderIcon = "media/images/openfolder.png";

  webFXTreeConfig.fileIcon   = "media/images/file.png";

  webFXTreeConfig.lMinusIcon = "media/images/Lminus.png";

  webFXTreeConfig.lPlusIcon   = "media/images/Lplus.png";

  webFXTreeConfig.tMinusIcon   = "media/images/Tminus.png";

  webFXTreeConfig.tPlusIcon = "media/images/Tplus.png";

  webFXTreeConfig.iIcon   = "media/images/I.png";

  webFXTreeConfig.lIcon   = "media/images/L.png";

  webFXTreeConfig.tIcon = "media/images/T.png";

  webFXTreeConfig.blankIcon = "media/images/blank.png";

 webFXTreeConfig.loadingText = "Загрузка..."

 webFXTreeConfig.defaultAction = "";

  var rti;

  <?php

$action='';

$action1='';

if ( $edittree == 1) {   $action="&amp;action=edittree";

  $action1="&action=edittree"; }

echo 'var tree = new WebFXLoadTree("'.$rootName.'", "index.php?task=node'.$action1.'&root='.$rootid.'&id='.$rootid.'&no_html=1","index.php?task=right'.$action.'&amp;root='.$rootid.'&amp;id='.$rootid.'");';   ?>

  tree.target="right";

  document.write(tree);

  </script>

  <?php } }   ?>

Программный код Top.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

 

class HTML_Top {

  function Show($rows) {

  global $isAdmin;

?>

 

  <script language="Javascript">

  <!--

var bName = navigator.appName;

var bVer = parseInt(navigator.appVersion);

    function sw(addto) {

if (!(bName == "Microsoft Internet Explorer" && bVer < 4)){

  var posX = (screen.width - 1024) / 2;

  var posY = (screen.height - 768) / 2;

  open("index.php?task=add","sw","width=1024,height=768,resizable=yes,scrollbars=yes,top="+posY+",left="+posX)

} else {

alert ("This function is not available with MS IE 3.x")

}

}//-->

  </script>

 

  <div>

<div>

<div>

<form name="mainForm">

<table cellpadding="0" cellspacing="0">

<tr>

  <td>

    </td>

  <td>

  <td>

<span>

<select>

    onchange="window.parent.left_bottom.location='index.php?task=left&root='+this[selectedIndex].value;window.parent.right.location='index.php?task=right&root='+this[selectedIndex].value+'&id='+this[selectedIndex].value;">

<?php

  foreach ( $rows as $row ) {

echo '<option value="' . $row['ID'] . '">' . $row['Name'] . '</option>';

  }

 

  ?>

  </select>

  </td>

  <td>

  <script language="JavaScript">

  <!--

  var sel = document.mainForm.selectcn;

  window.parent.left_bottom.location='index.php?task=left&root='+sel[sel.selectedIndex].value;

    window.parent.right.location='index.php?task=right&root='+sel[sel.selectedIndex].value+'&id='+sel[sel.selectedIndex].value;

  <?php

  if ( $isAdmin ) {

  ?>

if (!(bName == "Microsoft Internet Explorer" && bVer < 4))

document.write('<a href="JavaScript: sw(\'add\')" title="Добавить справочник"><b>Добавить</b></a>');

  <?php

  }

  ?>

  // -->

  </script>

  </td>

</tr>

</table>

</form>

</div>

  </div>

<?php

  }

}

?>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Программный код Node.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

 

class HTML_Node {

  function Show($rootid, $rows, $edittree) {

  header('Content-type: text/xml');

  header('Accept-Ranges: bytes');

  echo '<?xml version="1.0" encoding="windows-1251" ?>';

?>

 

<tree>

  <?php

 

  foreach ( $rows as $row ) {

 

if ( $row['count'] > 0 || $edittree == 2 ) {

$action='';

if ( $edittree == 1) {

$action="action=edittree&amp;";

}

 

  $src='index.php?task=node&amp;no_html=1&amp;'.$action.'root='.$rootid.'&amp;id='.$row['ID'];

$linkaction='index.php?task=right&amp;'.$action.'root='.$rootid.'&amp;id='.$row['ID'];

 

if ( $edittree == 2) {

$action="&amp;action=selecttree&amp;";

  $src='index.php?task=node&amp;no_html=1&amp;'.$action.'root='.$rootid.'&amp;id='.$row['ID'];

$linkaction='javascript:selecttree('.$row['ID'].');';

if ( $row['count'] == 0 ) {

$src='';

}

}

}

else {

$src='';

$linkaction='';

}

  echo '<tree text="'.htmlspecialchars($row['Name']).'" src="'.$src.'" action="'.$linkaction.'" target="right" /> ';

  }

  ?>

</tree>

<?php

  }

}

?>

Программный код Export.php

<?php

defined( '_VALID_CN' ) or die( 'Error!' );

 

class HTML_Export {

  function Show($request, $fieldsTypes, $objectDescription, $fields, $rows) {

  ?>

  <Directory

  code="<?php echo $objectDescription['ID'];?>"

  name="<?php echo $objectDescription['Name'];?>"

  lang="ru_RU"

  start=""

  end=""

 

  >

  <Description>

<List

code = "<?php echo $objectDescription['ID'];?>"

name = "<?php echo $objectDescription['Name'];?>"

start = ""

end = ""

>

<Attributes>

<?php

foreach ($fields as $field) {

echo '<Attribute

  code = "'.$field['ID'].'"

  name = "'.$field['FieldName'].'"

  datatype = "'.$field['TypeName'].'"

  empty = "yes"

  unique = "no"

    />';

 

}

  ?>

</Attributes>

</List>

  </Description>

  <Items>

<?php

foreach ($rows as $row) {

echo '<Item

code = "'.$row['ID'].'"

name = "'.htmlspecialchars($row['Name']).'"

level = "'.$row['Level'].'"

  parent = "'.$row['ParentID'].'"

 start = "'.$row['Date0'].'"

  end = "'.$row['Date1'].'"

  >

  <Attributes>';

foreach ($fields as $field) {

echo '<Attribute

  code = "'.$field['ID'].'"

  value = "'.htmlspecialchars($row[$field['FieldName']]).'"

    start = "'.$row['Date0'].'"

    end = "'.$row['Date1'].'"

  />';

 

}

echo '</Attributes></Item>';

}

  ?>

 

<!--Item

code

name

level

parent

start

end

/>

<Attributes>

<Attribute

code

value

start

end

/>

</Attributes>

</Item-->

  </Items>

  </Directory>

 

 

<?php

  }

  function PageHeader ($request) {

  header('Content-type: text/xml');

  header('Accept-Ranges: bytes');

?>

<?xml version="1.0" encoding="windows-1251" ?>

<Dir>

  <Request

  request_id="<?php echo $request['id'];?>"

  directory_code="<?php echo $request['directory_code'];?>"

  start_period="<?php echo $request['start_period'];?>"

  end_period="<?php echo $request['end_period'];?>"

  actual_date="<?php echo $request['actual_date'];?>"

  />

  <Format

  encoding="windows-1251"

  decimal_separator="."

  thousand_separator="'"

  list_separator=","

  />

  <Type_definition>

  <?php

  }

 

  function PageHeaderF () {

  ?>

 

  </Type_definition>

  <?php

  }

 

  function PageFooter () {

  ?>

</Dir>

  <?php

  }

  function ShowTypes ($request, $fieldsTypes, $objectDescription, $fields) {

  foreach ($fieldsTypes as $type) {

echo '<simpleType name="'.$type['TypeName'].'">

<restriction base="'.$type['FieldType'].'">

  <length value = "'.$type['FieldSize'].'"/>

</restriction>

</simpleType>';

echo "\n";

  }

  }

}

?>

 

 


РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ СОЦИАЛЬНЫЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ КАФЕДРА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И АВТОМАТИЗИРОВ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ