(Возврат на основную
страницу)
Содержание номера за Апрель 2004 год
Editorial
Некоторые возможности следующей версии SQL Server «Yukon» будут
предусмотрительно выключены
Лиза Ваас (Lisa Vaas)
В своем стремлении сделать следующую версию SQL Server более
защищенной, Microsoft планирует поставлять ее с некоторыми возможностями в
состоянии «выключено». Об этом сообщил директор по СУБД SQL Server Том Риццо
(Tom Rizzo).
Хотя сейчас трудно сказать, какие конкретно опции будут
выключены, базовая функциональность будет доступна прямо «из коробки», чтобы не
создавать чрезмерных проблем при развертывании продукта. «Мы не собираемся
ставить вас перед тем фактом, что инсталлированный продукт не запускается», —
сказал г-н Риццо.
Инженеры Microsoft также работают над тем, чтобы пользователям
не приходилось тратить слишком много сил на активизацию выключенной
функциональности. «Новую функциональность — расширения и то, что делает
следующую версию SQL Server еще лучше, — мы по умолчанию выключаем, но сделаем
легким процесс включения. Мы не хотим, чтобы пользователи упрекали нас в том,
что попытка включить неоходимую им функциональность составляет целую проблему».
По некоторым признакам вторая бета-версия SQL Server 2005 (это
официально объявленное название следующей версии SQL Server), ожидаемая в конце
весны — начале лета, находится в довольно продвинутой стадии.
Тогда как бета-версия 1 была доступна только узкому кругу
специалистов, бета-версия 2 будет публичной, и заинтересованные специалисты
смогут принять участие в программе Customer Preview.
В то время как пользователи ожидают выхода следующей версии,
текущая получает дополнительные возможности с точки зрения безопасности. По
словам г-на Риццо, Microsoft вкладывает дополнительные средства в обеспечение
безопасности и осуществляет дополнительное финансирование программы обучения
разработчиков и пользователей.
Одним из таких образовательных ресурсов является новый
Security Guidance Center на сайте Microsoft TechNet (http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/default.asp).
Центр запущен примерно в середине марта и представляет собой портал для всех
пользователей и разработчиков, заинтересованных в получении информации о
вопросах безопасности, связанных с SQL Server. Дополнительное финансирование
будет также направлено на такие вещи как Webcast, статьи и другие
образовательные действия для внешних партнеров и заказчиков.
Г-н Риццо особо отметил автоматический инструмент Baseline
Security Analyzer (http://www.microsoft.com/downloads/details.aspx?FamilyID=8b7a580d-0c91-45b7-91ba-fc47f7c3d6ad&displaylang=en)
как доказательство того, что корпорация помогает пользователям обеспечить
безопасность систем на базе SQL Server. Выпущенный около двух лет назад, этот
автоматизированный инструмент выполняет поиск систем и приложений, не закрытых
«заплатками» и указывает пользователям, что именно им необходимо установить и
где найти соответствующие «заплатки». Кроме того, компания планирует выпустить
инструмент, подобный существующему Windows Update, но направленному на
устранение брешей в SQL Server. Окончательная дата выхода этого инструмента пока
не объявлена.
Многие ожидают похожего инструмента, надеясь, что он поможет
им защититься от атак, подобных той, что организовал вирус Slammer. Усилия
Microsoft, направленные на обеспечение безопасности SQL Server, похоже, приносят
свои плоды. С момента выхода SP3 (более года назад) только однажды был поднят
красный флаг критической опасности.
Что же касается Yukon, то разработка этого продукта проходит
по трем этапам. Сначала программные менеджеры (руководители проектов),
разработчики и тестеры направляются на учебу, где знакомятся с наиболее часто
встречающимися проблемами прикладного кода. По словам г-на Риццо, это открытые
порты, непроверяемые буферы и превышение разрядности.
Затем, на этапе проектирования функциональности сервера,
руководители проектов задают ритуальные вопросы об открытых портах, особенностях
того или иного аспекта функциональности с точки зрения безопасности, уязвимости
к атакам с внедрением кода (code injection). Только после того как они получат
надлежащие ответы, разработчикам разрешают реализовать соответствующую
функциональность.
На третьем этапе используются автоматизированные инструменты,
сканирующие каждую строку кода в поисках стандартных ошибок. Такому исследованию
подвергся код SQL Server 7.0 и 2000, на это ушло около трех месяцев. Результаты
анализа были использованы при создании SP3.
DB Design & Warehousing
Используем псевдонимы столбцов где угодно
Том Моро (Tom Moreau)
Том Моро охотно соглашается, что некоторые из лучших идей,
используемых им в статьях, исходят от его студентов. Например, недавно студентка
спросил его, почему она не может поместить псевдоним столбца где-либо в
операторе SELECT, например в конструкции WHERE. К сожалению, единственным
местом, в котором можно использовать псевдоним столбца, является конструкция
ORDER BY. Посмотрите, как наш маэстро MVP помог студентке обойти это
ограничение.
Я ненавижу слышать в ответ «нет», но еще больше я ненавижу
говорить в ответ «нет». Сообщив своей студентке об этой плохой новости, я
подумал о том, как попытаться обойти данную проблему. Я начну с самой проблемы и
покажу вам, где псевдонимы не могут быть использованы, а затем подскажу обходной
путь. Я буду использовать всемирно известную БД Northwind.
Представим, что вы хотите посмотреть OrderID, ProductID и
Value для каждой записи Order Detail, где вычисляемое значение определяется
следующим образом: Quantity * UnitPrice * (1.0 — Discount), и это значение
должно быть больше 7500 долларов. Также вы хотите сортировать результат по Value
в порядке убывания.
OLAP-приложения для администраторов БД
Ричард Мо (Richard Maw)
Считаете ли вы, что Microsoft Analysis Services предназначены
в основном для бизнес-аналитиков и других «белых воротничков»? Подумайте над
этим еще раз. Статья Ричарда Мо позволяет взглянуть на этот вопрос по-новому и
показывает, как заставить Analysis Services работать для вас.
Возможности оперативной аналитической обработки данных (OLAP,
online analytical processing) для Analysis Services являются мощным и интересным
дополнением к Microsoft SQL Server, в особенности для построения приложений
business intelligence, позволяющих определять тенденции, составлять прогнозы,
искать отклонения и т. д. Моя цель, однако, не в том, чтобы снабдить вас еще
одним учебным пособием по кубам, но навести на мысль, что OLAP может
использоваться также и администраторами БД. Я написал два OLAP-приложения,
выполняющих задачи по мониторингу БД. В этой статье я представлю первую из них.
Большинство администраторов БД используют Enterprise Manager в
качестве главного интерфейса сервера, а состояние сервера в некоторой степени
открывается через системные таблицы. С появлением OLAP этот порядок вещей не
изменился. Изменилось то, что мы можем делать с данными, захватываемыми с
помощью SQL.
Первое описываемое мною OLAP-приложение для администраторов БД
используется для отслеживания операций INSERT, UPDATE и DELETE на уровне строк.
С его помощью мы сможем составлять отчет для любой таблицы, зарегистрированной в
нашей системе, о том, как много операций обновления, ввода или удаления было
выполнено на ней. Используя OLAP-куб, вы сможете агрегировать итоги за любой
период, равный одному часу (выбранный мною интервал моментального снимка) или
превышающий это время.
Programming
Реализация обработки ошибок в хранимых процедурах. Часть 2
Эрланд Соммарског (Erland Sommarskog)
Откатывать или не откатывать — вот в чем вопрос…
В процедуре error_test_demo я выполнял откат только в том
случае, если сам запускал транзакцию или вызывал хранимую процедуру. В этом
разделе я продолжу обсуждение того, когда нужно выполнять откат, а когда нет.
Other
Подсказка: перемещение баз данных и пользователей
Энди Броган (Andy Brogan)
Мы часто перемещаем базы данных из инструментальной среды в
среду тестирования, а затем, в конечном счете, на производственные серверы или
серверы отчетов. Возможно, вы тоже занимаетесь этим и знаете, что при
перемещении БД теряются регистрационные имена (login). Их можно восстановить,
используя хранимую процедуру sp_change_users_login, но эту команду необходимо
выполнить один раз для каждого пользователя в БД. Эта задача может оказаться
довольно сложной, если большому числу ваших пользователей необходимо
использовать БД в ее новом расположении. Я написал сценарий, который
автоматически запускает sp_change_users_login для всех пользователей.
Подсказка: поддержка низкого профиля
Том Моро (Tom Moreau)
Если вы должны заниматься поисками неисправностей в продукте,
то наверняка захотите, чтобы это как можно меньше сказывалось на ваших
пользователях. Вот прием, используемый для поддержки низкого профиля.
Query Analyzer остается одним из наилучших инструментов для
выявления неисправностей, когда-либо используемых мною, сразу за ним следует
Profiler. Не знаю, как вы, но я в ходе поиска неисправностей часто сталкиваюсь с
необходимостью выполнять запросы в производственной среде. Понятно, что мне не
хотелось бы, чтобы мой запрос служил помехой для кого-либо из моих
пользователей. Звучит знакомо? Администраторы БД должны помнить наиболее
известный отрывок из клятвы Гиппократа: «Не навреди». Я понимаю, что существует
разница между администратором БД и доктором, но мы выполняем схожую работу — в
особенности это касается диагностики и сохранения «жизни» (то есть БД).
Простейшим способом помешать выполнению запросов пользователей
является использование запросов, приводящих к возникновению блокировок. Уровнем
изоляции транзакций по умолчанию является READ COMMITTED. Другими словами, ваш
запрос будет принимать блокировки других запросов, а ваши операторы SELECT будут
пропускать разделяемые блокировки. Если ваши запросы выполняются долгое время,
то будут создавать проблемы для пользователей, а это плохо.
Моим решением является введение следующего оператора при
каждом выполнении запроса в производственной среде:
SET TRANSACTION
ISOLATION LEVEL READ UNCOMMITTED
Масштабировать по вертикали или по горизонтали?
Том Моро (Tom Moreau)
Все «зависает»? Аппаратное обеспечение «выдохлось»? Значит,
пришло время для обновления. Но какого? Должны ли вы выбрать более мощный
компьютер или стоит говорить о нескольких компьютерах? Подсаживайтесь к нам и
доктор Том Моро поделится своими взглядами на эту важную тему.
Успех приложения зачастую может быть измерян тем, насколько
быстро исчерпывается свободное дисковое пространство на вашем сервере. Это
означает, что у вас (или, если быть более точным, у вашей компании или клиента)
есть способ накапливать больше данных, чем даже можно мечтать. Пора ли вас
поздравить? И да, и нет. Я бы преподнес вам букет цветов за столь быстрый рост,
но бросил камень за то, что вы не запланировали подобную возможность с самого
начала.
Но не отчаивайтесь, это не только ваша вина. У вас
фиксированный бюджет, не так ли? Возможно, вы получали то, что когда-то было
самой современной технологией, но она диктовала определенные размеры сервера,
которые по сегодняшним стандартам слишком малы. Кроме того, ваши пользователи
также ошибались в своих оценках. К сожалению, сегодня те же самые тихие
пользователи (или их последователи) клянутся, что их жизни возможна, только если
они работают с вашей базой данных и тем кладезем информации, который она,
оказывается, предоставляет.
Однако дело не только в дисковых накопителях. Постоянный
мониторинг использования процессора показывает все больше и больше скачков до
100 %, а пользователи в то же время продолжают «загонять» бедную машину пакетами
незапланированных запросов. И в завершение всего у вашей машины не хватает
памяти!
Том отвечает на ваши письма
Том Моро (Tom Moreau)
Вопрос: Я прочитал вашу статью по индексированным вычисляемым
столбцам: Мне хотелось бы, чтобы вы дали какой-нибудь совет по использованию
типа данных sysname — я даже не подозревал об его существовании.
Ответ: В настоящее время тип данных sysname — это nvarchar
(128), но, как правило, он используется как varchar (30). Sysname применяется
для системных имен, таких как регистрационное имя, имя таблицы, имя индекса и т.
д. Каждый раз, экспериментируя с системными таблицами, я использую его. Но если
вы не создаете сценарии, использующие системные объекты, то вам не стоит
беспокоиться об этом. Вы можете прочесть дополнительную информацию об этом типе
данных в Books Online в разделе «Data Types», где sysname описывается как
специальный пользовательский тип данных для поддержки системы, функционально
эквивалентный Unicode nvarchar (128), используемый, в свою очередь, для ссылок
на имена объектов БД.
Вопрос: Я пытался предоставить все права на все
пользовательские таблицы некоторой роли, но получил сообщение об ошибке для
приведенного ниже сценария:
DECLARE @tablename varchar(30)
DECLARE @tablename_header varchar(75)
DECLARE tnames_cursor CURSOR FOR
SELECT name FROM sysobjects
WHERE type = 'U'
ORDER BY name
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@fetch_status <> -1)
BEGIN
IF @@fetch_status <> -2
BEGIN
EXEC ('GRANT REFERENCES , SELECT ,
UPDATE , INSERT , DELETE ON ' + @tablename +
'TO ' [PSuper])
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
Ответ: Я бы поостерегся предоставлять разрешение REFERENCES,
поскольку оно позволяет кому угодно создавать таблицы с внешним ключом к вашей
таблице; dbo должен быть владельцем всех таблиц. В остальном же я бы просто
добавил эту роль к ролям db_datareader и db_datawriter:
sp_addrolemember Ã
'db_datareader', 'MyOutstandingRole'
go
sp_addrolememberÃ
'db_datawriter', 'MyOutstandingRole'
go
Это позволит в MyOutstandingRole применять операторы SELECT,
INSERT, UPDATE и DELETE ко всем пользовательским таблицам и представлениям в
вашейбазе данных.
Вопрос: Зачастую мне требуется выполнить запрос, возвращающий,
помимо всего прочего, столбец, который содержит разделенный запятыми список
строчных значений. Простым примером может служить таблица AuthorsInPublication с
тремя столбцами: pub_id, author_name и author_order (author_id более
предпочтителен, но давайте пойдем на это упрощение). Я хотел бы выполнить
примерно следующее:
SELECT pub_id, list(author_name)
FROM AuthorsInPublication GROUP BY pub_id
Ответ: Если вы не можете написать вашу собственную агрегатную
функцию в SQL Server, то думаю, все же существует способ выполнить то, что вам
требуется. Можно применить пользовательскую функцию, создающую единственную
строку, в данном случае основанную на входном параметре первичного ключа. Вот
этот код:
create function dbo.AuthorList
(
@title_id tid
)
returns varchar (8000)
as
begin
declare @str varchar (8000)
set @str = ''
if @title_id is null
return ''
select
@str = @str + left (a.au_fname, 1) + '. ' +
a.au_lname + ', ' from authors a
join titleauthor ta on ta.au_id = a.au_id
where
ta.title_id = @title_id
order by
ta.au_ord
if (len (@str) > 1)
set @str = left (@str, len (@str) - 1)
return (@str)
end
go
select
title_id
, dbo.AuthorList (title_id) 'authors'
from
titles
order by
title_id
go
По существу, вы передаете этой функции некоторый title_id, а
она возвращает вам список авторов для этого title_id. Обратите внимание, что я
добавил код для обработки ситуаций, при которых для title_id не существует
авторов. В этом случае я просто возвращаю пустую строку.
Вопрос: После сжатия файла данных в действующей БД я получил
следующий результат:
database_name database_size unallocated space
------------- ------------------ ------------------
LIVE 347207.13 MB -24077.91 MB
В этом результирующем наборе незанятое пространство имеет
отрицательное значение. О чем это говорит и в чем значение незанятого
пространства? Не нанесет ли это ущерб целостности моей действующей БД?
Ответ: Получение отрицательного значения в выходных данных
процедуры sp_spaceused более распространенное явление, чем вы думаете. Иногда
оно возникает при следующих условиях:
· при наличии множества операторов UPDATE, INSERT и
DELETE;
· при перестроении индексов;
· при усечении файлов БД.
Выполняя DBCC UPDATEUSAGE (0) в вашей БД, вы корректируете эти
записи в вашей таблице sysindexes. На самом деле это не слишком большая проблема
и она не должна вызывать вашего беспокойства.
Вопрос: Могу ли я определить с помощью SQL-запроса, какие
объекты помещены в какие группы файлов (filegroup)?
Ответ: Я и сам хотел всегда знать это, и вот как я нашел
решение. Прежде всего я запустил Profiler и отследил события SP:StmtCompleted и
SQL:BatchCompleted. Затем я запустил sp_help ‘Customers’ в БД Northwind. В
профиле трассировки Profiler был получен обильный материал, но самым интересным
оказался вызов sp_help незадокументированной системной хранимой процедуры sp_objectfilegroup.
В этой процедуре есть следующий кусочек кода:
-- sp_objectfilegroup
select Data_located_on_filegroup = s.groupname
from sysfilegroups s, sysindexes I
where i.id = @objid
and i.indid < 2
and i.groupid = s.groupid
Это заставило меня задуматься. Я проверил исходный код sp_objectfilegroup.
Верите или нет, но в нем оказались следы версии 6.5. Чтобы сделать все должным
образом, я переписал запрос. Для его проверки я привлек тестовую БД с группой
файлов PRIMARY и еще одной, пользовательской, названной FG1. Затем я создал
следующую таблицу и индексы:
create table tom
(
ID int not null identity
primary key nonclustered
on [PRIMARY]
, other char (5) not null
, another char (5) not null
)
create clustered index C_tom on tom (other) on FG1
go
create index NC_tom on tom (another) on FG1
go
Затем, чтобы увидеть все таблицы, индексы и группы файлов, я
запустил следующий запрос:
Select
object_name (i.id)
, i.name
, g.groupname
from
sysfilegroups g
join sysindexes i on i.groupid = g.groupid
(Возврат на основную
страницу)