Perl для системного администрирования

         

Добавление данных в таблицу



Добавление данных в таблицу

Теперь у нас есть пустая таблица; так что рассмотрим два способа добавления в нее данных. Вот первый способ:

USE sysadm INSERT hosts VALUES (

'shimmer',

'192.168.1.11',

'shim shimmy shimmydoodles',

'David Davis',

'Software',

'Main',

'309',

'Sun',

'UItra60' )

В первой строке мы сообщаем серверу, что собираемся работать с объектами из базы данных sysadm. Во второй строке выбирается таблица hosts и в нее добавляются строки - по одному полю за один раз.
Такой вариант команды INSERT добавляет в таблицу всю строку целиком (ту, в которой определены все поля). Чтобы добавить строку только частично, можно указать, какие поля следует дописать, например, так:

USE sysadm

INSERT hosts (name.ioaddr.owner) VALUES ( 'bendir', '192.168.1.3', 'Cindv Coltrane )

Команда INSERT завершится с ошибкой, если попытаться добавить строку, в которой определены не все обязательные (NOT NULL) поля.

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



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





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

На некоторых SQL-серверах можно на лету создать новую таблицу, содержащую результаты запроса, при помощи ключевого слова INTO:

USE sysadm

SELECT name,ipaddr INTO itmachines FROM hosts WHERE deot = IT'

Этот оператор работает так же, как и предыдущие, за одним исключением: результаты данного запроса помещаются в таблицу под названием itmachines. На некоторых серверах такая таблица создается на лету в случае, если она еще не существует. Этот оператор можно считать эквивалентом оператора «>» в большинстве систем Unix и командных интерпретаторах NT.

Отдельные серверы баз данных (как MySQL) не поддерживают оператор SELECT INTO; для выполнения этого действия в них нужно применять команду INSERT. Другие серверы, например MS-SQL и Sybase, требуют установки специального флага на базу данных для использования SELECT INTO, иначе команда завершится с ошибкой.



Дополнительные аспекты SQL



Дополнительные аспекты SQL

Перед тем как завершить это руководство, нужно упомянуть о более «продвинутых» темах из SQL, с которыми вы можете столкнуться.

Представления

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

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

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

Вот как создать представление, используемое для упрощения запросов:

USE sysadm

CREATE VIEW ipddr_vie/,- AS SELEC''" nde. loaddr FROM hosts

Теперь можно применить очень простой запрос, чтобы получить только ту информацию, которая нам нужна:

USE sysadm

SELECT FROM maddr view

А вот результат запроса:

name ipaddr

shimmer 192.168.1.11

bendir 192.168,1.3

sander 192.168. 1 55

Sulawesi 192 168,1,12

Как и таблицы, представления можно удалять, используя раоновидность команды DROP:

USE sysadm

DROP VIEW ipaddr_view



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



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

Большинство систем баз данных позволяют загружать на сервер SQL код, где он хранится в оптимизированном, проанализированном виде для быстрого выполнения. Такой код называется хранимыми процедурами (stored procedures). Хранимые процедуры часто являются важ
ным компонентом SQL для администраторов, поскольку на них основана большая доля управления сервером. Например, чтобы изменить владельца базы данных sysadm в Sybase, нужно выполнить следующее:

USE sysadm sp_changedbowner "jay"

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



Изменение информации в таблице



Установление связей между таблицами

Реляционные базы данных предлагают множество способов установить связи между данными из двух или более таблиц. Этот процесс называется объединением («joining») таблиц. Объединения очень быстро могут стать сложными, учитывая количество используемых запросов и точный контроль, который программист имеет над возвращаемыми данными. Тем, кого интересуют такие детали, лучше заглянуть в книгу по SQL.

Рассмотрим один пример объединения. Здесь будет использоваться таблица под названием contracts, в которой содержится информация о гарантиях на каждую машину (табл. D.3).



Курсоры



Курсоры

До сих пор сервер возвращал все результаты запроса по его завершении. Иногда бывает предпочтительнее получать ответ построчно. Чаще всего это справедливо при встраивании SQL-запросов в другие программы. Если запрос возвращает десятки тысяч строк, очень велика вероятность, что вам захочется обработать результаты построчно, а не хранить все в памяти для дальнейшего использования. Этот метод применяется в большинстве случаев, когда необходимо обращаться к SQL из Perl. Вот маленькая программа на SQL, в которой показано употребление курсоров на сервере Sybase или MS-SQL:

USE sysadm

-- объявляем переменные DECLARE (ahostname character(30) DECLARE @ip character(15)

-- объявляем курсор

DECLARE hosts_curs CURSOR FOR SELECT name,ipaddr FROM hosts

-- открываем курсор OPEN hosts_curs

-- обходим в цикле таблицу, получая по одной строке за один раз -- до тех пор, пока не получим ошибку FETCH hosts_curs INTO shostname,gip WHILE (@@fetch_status = 0) BEGIN

PRINT "----"

PRINT (Briostriame

PRINT @ip

FETCH hosts_curs INTO Shostname.^iD END -- закрываем курсор (это не обязательно если -- далее следует DEALLOCATE) CLOSE hosts._curs

-- снимаем определение (unde'ine) курсора DEALLOCATE hosts_curs

В результате получается следующее:

shimmer 192.163.1.11

bendir 192.168.1.3

sander 192.168.1.55

Sulawesi 192.168.1.12



Пятнадцатиминутное руководство



Таблица D.I. База данных машин

name ipaddr aliases owner dept bldg room manuf model
shimmer 192.168.
1.11
shim
shimmy
shimmy-
doodles
David
Davis
soft-
ware
main 309 Sun Ultra60
bendir 192.168.
1.3
ben ben-
doodles
Cindy
Col-
trane
IT west 143 Apple 7500/
100
sander 192.168.
1.55
sandy
micky
micky-
doo
Alex
Rol-
lins
IT main 1101 Inter-
graph
TD-325
Sulawesi 192.168.
1.12
sula
sulee
Ellen
Monk
design main 1116 Apple G3


Получение подмножества строк из таблицы



Получение подмножества строк из таблицы

Базы данных не были бы такими интересными, если бы из них нельзя было получить некое подмножество данных. В SQL употребляется команда SELECT, в которую добавлено ключевое слово WHERE для определения условия:

USE sysadm

SELECT - FROM hosts WHERE blog = "Ma:r!'

В результате получаем:

name ipaddr aliases owner .\i--.r.

bldg room manuf model

shimmer 192.168.1,11 shim shimmy shimmydoodles David Cav.s but",-, -.-

Main 309 Sun Ultra60

sander 192.168 1.55 sandy iricky mickydoo Alex РоП.гь I"

Main 1101 Intergraph TD-325

Sulawesi 192.168.1.12 sula su-lee Ell"' Monk Се

Main 1116 Apple G3

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

=>>=<<=<>

В отличие от Perl, в SQL нет отдельных операторов для сравнения строк и чисел.

Условные операторы можно объединять посредством AND/OR и отрицать при помощи NOT. Проверить, является ли поле пустым, позволяет оператор IS NULL, а проверить обратное - IS NOT NULL. Например, этот фрагмент SQL-кода выведет список машин, для которых в таблице не указаны владельцы:

USE sysadm

SELECT name FROM hosts WHERE owner IS NULL

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

USE sysadm

SELECT name FROM nosts WHERE dept IN ('IT', 'Software')

Ответом будет список машин из отделов «IT» и «Software». SQL также позволяет получить строки, совпадающие с диапазоном значений (полезнее всего это применять с численными данными и датами), при помощи оператора BETWEEN. Вот пример запроса, возвращающий список машин, находящихся в основном здании на десятом этаже:

USE sysadm

SELECT name FROM hosts WHERE (bldg = 'Main') AND

(room BETWEEN '1000' AND '1999')

Наконец, ключевое слово WHERE можно использовать с LIKE для выбора строк при помощи слабого механизма соответствия шаблону (слабого в сравнении с регулярными выражениями в Perl). Например, следующий запрос выбирает все машины, в псевдонимах которых встречается строка «doodles»:

USE sysadm

SELECT name FROM nosts WHERE aliases LIKE '%dooales%'

Обратите внимание, какие метасимволы поддерживаются (табл. D.2).



Простая обработка данных возвращаемых в результате запросов



Простая обработка данных, возвращаемых в результате запросов

У оператора SELECT существуют два полезных ключевых слова: DJSTINC1 и ORDER BY. Первое позволяет изъять из запроса повторяющиеся записи. При желании получить список всех различных производителей, представленных в таблице hosts, можно было бы использовать DISTINCT:

USE sysadm

SELECT DISTINCT manuf FROM hosts

При необходимости получить отсортированные данные, можно было бы применить ORDER BY:

USE sysadm

SELECT name.ipaddr.dept,owner FROM hosts ORDER BY aept

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



Создание/удаление баз данных и таблиц



Создание/удаление баз данных и таблиц

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

CREATE DATABASE sysadm ON userdev=10 LOG ON userlog=5 GO

Данная команда создает 10-мегабайтную базу данных на устройстве jserdev с 5-мегабайтным файлом журнала на устройстве userlog. Эта команда специфична для серверов Sybase/Microsoft SQL Server, т. к. создание баз данных (если оно вообще выполняется) на разных серверах производится поразному.

Команда GO применяется с интерактивными клиентами баз данных и служит указанием на то, что необходимо выполнить предыдущую команду. Но это не SQL-оператор. В следующих примерах будем считать, что команду GO необходимо выполнять после каждого SQL-оператора, если используется один из таких клиентов. Кроме того, комментарии в SQL будут обозначаться при помощи «- -».

Чтобы удалить эту базу данных, необходимо выполнить команду DROP:

DROP DATABASE sysadm

Теперь создадим пустую таблицу, в которой будет храниться информация из табл. D.I.

USE sysadm

-- Последнее напоминание: перед тем как выполнить следующую

-- команду, необходимо набрать GO (если вы используете

-- интерактивный клиент)

CREATE TABLE hosts (

name characterise) NOT NULL,
ipaddr character(15) NOT NULL,
aliases character(SO) NULL,
owner character(40) NULL,
dept character(15) NULL,
bldg character(IO) NULL,
room character(4) NULL,
manuf character(IO) NULL,
model

) character(IO) NULL

Сначала мы указываем, какая база данных (sysadm) будет использоваться. Оператор USE оказывает действие только в том случае, когда он выполняется отдельно до запуска других команд, поэтому ему нужен собственный оператор GO.

Затем мы создаем таблицу, указывая ее имя, тип и длину данных, а также настройки NULL/NOT NULL для каждого столбца. Теперь немного поговорим о типах данных.

В таблице можно хранить различные типы данных, включая числа, даты, текст и даже изображения и другие двоичные данные. Столбцы в ней создаются для хранения данных определенного типа. У нас
скромные потребности, поэтому таблица состоит из столбцов, хранящих простые строки characters (символов). В SQL можно строить определяемые пользователями псевдонимы типов данных, такие как ip_address или employeeid. Определяемые пользователями типы данных применяются при создании таблиц для поддержки читаемости ее структуры, а также для форматов данных, которые не должны меняться от столбца к столбцу в разных таблицах.

Последний набор параметров в предыдущей команде определяет, обязательным ли является поле. Если параметр равен NOT NULL, то новую строку нельзя добавить в случае, если в этом поле у нее нет данных. В нашем примере важны имя машины и ее IP-адрес, так что следует объявить эти поля как NOT NULL. Все остальные поля необязательны (хоть и желательны). Помимо NULL/NOT NULL существуют и другие ограничения, накладываемые на поля для согласованности данных. Например, чтобы убедиться, что две машины не называются одинаково, можно изменить строку

name character(30) NOT NULL

на:

name character(30) NOT NULL CONSTRAINT unique_name UNIQUE

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

Удалить таблицу из базы данных значительно проще, чем создать ее:

USE sysadm

DROP TABLE hosts



D 2 Метасимволы LIKE



Таблица D.2. Метасимволы LIKE

Метасимвол Значение Ближайший эквивалент из
регулярных выражений Perl
% Ноль или более символов .*
- Один символ .
[] Один символ из указанного списка или диапазона []

В некоторых серверах баз данных добавлены расширения к SQL, позволяющие применять регулярные выражения в операторах SELECT. Например, в MySQL существует оператор REGEXP, который можно использовать с SELECT. REGEXP не обладает всей силой регулярных выражений Perl, но он значительно увеличивает их гибкость по сравнению со стандартными метасимволами SQL.



D 3 Таблица Contracts



Таблица D.3. Таблица Contracts

name servicevendor start date enddate
bendir Dec 09-09-1995 06-01-1998
sander Intergraph 03-14-1998 03-14-1999
shimmer Sun 12-12-1998 12-12-2000
Sulawesi Apple 11-01-1995 11-01-1998

Вот один из способов установить отношение между таблицей hosts и таблицей contracts при помощи объединения:

SELECT name.servicevendor,enddato FROM r,nr\ -rifts, hosts WHERE contracts, name = nosn. r;vne

Проще всего понять этот код, если начать читать его с середины. Условие FROM contacts, '"osrs говорит серверу о том, что связь устанавливается между таблицами contracts и hosts. Условие WHERE hosts, name сообщает, что мы ищем совпадения между строками из таблиц contracts и hosts, основываясь на содержимом поля из каждой таблицы. Наконец, строка SELECT, определяет поля, которые мы хотим включить в получаемые данные.



Запрос информации



Запрос информации

Являясь системным администратором, чаще всего вы будете применять SQL-команду SELECT, которая используется для получения информации с сервера. Перед тем как говорить об этой команде, нужно заметить, что SELECT - это пропуск в мир SQL. Мы покажем только самые простые формы данной команды. Умение создавать хорошие запросы (и умение проектировать базы данных, к которым легко такие запросы строить) - это искусство, и более подробно этот вопрос рассматривается в книгах, целиком посвященных SQL и базам данных.

В самой простой форме SELECT служит для получения информации о сервере и соединении. В этом случае не нужно определять источник данных. Вот два примера:

-- оба зависят от производителя базы данных SELECT ©sfiERVERNAME SELECT VERSIONO.

Первый оператор возвращает имя сервера для Sybase или MS-SQL; второй - текущую версию сервера MySQL.

Получение всех записей из таблицы

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

USE sysach

SE! ЕС Г - FROM

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

name icacdr aliases

bldg roo"i Tianuf r.odel

shimmer 192.168.1.11 snm shimmy sh:rnmydood.es David Dav:

Main 309 Sun UTfra60

bendir 192.168.1.3 Den bendoodles Cindy Co;

West 143 Apple 7500/100

sander 192.168.1.55 sandy micky mickydoo Alex Rollins IT

Main 1101 Intergraph TD-325

Sulawesi 192.168.1.12 sula su-lee Ellen Monk Design

Main 1116 Apple G3

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

USE sysadm

SELECT name,ipaddr FROM hosts

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

USE sysadm

SELECT bldg.ipaddr FROM hosts

В результате получим:

bldg ipaddr

Main 192.168.1.11

West 192.168.1,3

Main 192.168,1.55

Main 192.168.1.12