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




Перед тем как завершить это руководство, нужно упомянуть о более «продвинутых» темах из 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-запросов в другие программы. Если запрос возвращает десятки тысяч строк, очень велика вероятность, что вам захочется обработать результаты построчно, а не хранить все в памяти для дальнейшего использования. Этот метод применяется в большинстве случаев, когда необходимо обращаться к 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



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



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

ным компонентом SQL для администраторов, поскольку на них основана большая доля управления сервером. Например, чтобы изменить владельца базы данных sysadm в Sybase, нужно выполнить следующее:

USE sysadm sp_changedbowner "jay"

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


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


Знание команды SELECT может пригодиться и при работе с другими командами. Например, упомянутая ранее INSERT также способна принимать ключевое слово SELECT. Это позволяет вставлять запрашиваемую информацию в существующую таблицу. Если отдел программного обеспечения вздумает объединиться с отделом IT, можно будет добавить машины из этого отдела в таблицу itmachines:

USE sysadm INSERT itmachines

SELECT name,ipaddr FROM hosts

WHERE dept = 'Software'

Если нужно изменить какую-либо строку в таблице, достаточно выполнить команду UPDATE. Например, если все отделы компании переведут в одно здание Cent ral, то имя здания в каждой строке можно будет изменить так:

USE sysadm UPDATE hosts

SET blag = 'Corral'

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

USE sysadm

SET dept = 'Development' WHERE dept = 'Software'

Упомянутая команда изменит название отдела Software на Doveon." . А данная команда переведет машину bendir в основной корпус:

USE sysadm UPDATE hosts

SET bldg = Main'

WHERE name = 'bendir'

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

USE sysadm DELETE hosts WHERE bldg = 'East'

He существует способа отменить операцию DELETE, так что будьте осторожны.



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


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

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






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


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

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

Таблица 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






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



Базы данных не были бы такими интересными, если бы из них нельзя было получить некое подмножество данных. В 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).

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




Метасимвол



Значение



Ближайший эквивалент из

регулярных выражений Perl

%

Ноль или более символов

.*

-

Один символ

.

[]

Один символ из указанного списка или диапазона

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



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



У оператора 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.



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



На некоторых 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, иначе команда завершится с ошибкой.