Система управления базами данных Microsoft Servers SQL. Управление базами данных посредством обозревателя объектов Object Explorer. Неограниченный размер базы данных

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

Я работал с VS2008 Database Edition в другой компании, и это потрясающий продукт. Мой босс попросил меня взглянуть на SQL Compare by Redgate и искать любые другие продукты, которые могут быть лучше. Сравнение SQL также является отличным продуктом. Однако, похоже, что они не поддерживают Perforce.

Вы использовали для этого множество продуктов?

Какие инструменты вы используете для управления SQL?

Что должно быть включено в требования, прежде чем моя компания совершит покупку?

10 ответов

Я не думаю, что есть инструмент, который может обрабатывать все части. VS Database Edition не позволяет создать достойный механизм выпуска. Запуск отдельных скриптов из браузера решений недостаточно масштабируется в больших проектах.

Как минимум вам нужно

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

Последняя пуля - это то, где вещи обычно ломаются. Вот почему. Для лучшей управляемости и отслеживания версий вы хотите сохранить каждый объект db в свой собственный файл script. То есть каждая таблица, хранимая процедура, представление, индекс и т.д. имеет свой собственный файл.

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

2 варианта, которые я использовал:

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

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

Я нахожусь в лагере "script it yourself", поскольку сторонние продукты будут только доводить вас до управления кодом базы данных. У меня нет одного script для каждого объекта, потому что объекты меняются со временем, а девять раз из десяти просто обновляют мою "таблицу создания" script, чтобы иметь три новых столбца были бы неадекватными.

Создание баз данных по большому счету тривиально. Настройте кучу скриптов CREATE, упорядочьте их правильно (создайте базу данных перед схемами, схемы перед таблицами, таблицы перед процедурами, вызовите процедуры перед вызовами и т.д.) И сделайте это. Управление изменением базы данных не так просто:

  • Если вы добавите столбец в таблицу, вы не сможете просто отбросить таблицу и создать ее с новым столбцом, потому что это приведет к уничтожению всех ваших ценных производственных данных.
  • Если Fred добавляет столбец в таблицу XYZ, а Mary добавляет другой столбец в таблицу XYZ, какой столбец добавляется первым? Да, порядок столбцов в таблицах не имеет значения [потому что вы никогда не используете SELECT *, правильно?], Если вы не пытаетесь управлять базой данных и отслеживать управление версиями, после чего у вас есть две "действительные" базы данных, которые не выглядят как друг друга, становятся настоящей головной болью. Мы используем SQL-сравнение не для управления, а для обзора и отслеживания вещей, особенно во время разработки, и немногие "они разные (но это не magger)", ситуации, которые мы можем, могут помешать нам заметить различия, которые имеют значение.
  • Аналогично, когда несколько проектов (разработчиков) работают одновременно и отдельно в общей базе данных, это может стать очень сложным. Возможно, все работают над проектом Next Big Thing, когда вдруг кто-то должен начать работу над исправлениями ошибок в проекте Last Big Thing. Как вы управляете требуемыми модификациями кода, когда порядок выпуска является переменным и гибким? (Действительно забавные времена.)
  • Изменение структур таблиц означает изменение данных, и это может стать адски сложным, когда вам приходится иметь дело с обратной совместимостью. Вы добавляете столбец "DeltaFactor", хорошо, так что вы делаете, чтобы заполнить это эзотерическое значение для всех ваших существующих (прочитанных: устаревших) данных? Вы добавляете новую таблицу поиска и соответствующий столбец, но как вы заполняете ее для существующих строк? Такие ситуации могут случаться не часто, но когда они это делают, вы должны делать это сами. Сторонние инструменты просто не могут предвидеть потребности вашей бизнес-логики.

По сути, у меня есть CREATE script для каждой базы данных, за которой следует серия сценариев ALTER, поскольку наша база кода изменяется со временем. Каждый script проверяет, может ли он быть запущен: это правильный "вид" базы данных, были выполнены необходимые предварительные сценарии, этот script уже запущен. Только когда пройдены проверки, script выполнит свои изменения.

В качестве инструмента мы используем SourceGear Fortress для управления базовым исходным кодом, Redgate SQL Compare для общей поддержки и устранения неполадок, а также ряд домашних сценариев на основе SQLCMD для "массового" развертывания скриптов с изменениями на несколько серверов и базы данных и отслеживать, кто применял какие скрипты к базам данных в какое время. Конечный результат: все наши базы данных являются стабильными и стабильными, и мы можем с готовностью доказать, какая версия есть или была в любой момент времени.

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

Обычно я использую MS Server Management Studio для управления sql, работы с данными, разработки баз данных и отладки его, если мне нужно экспортировать некоторые данные в sql script или мне нужно создать какой-то сложный объект в базе данных, я использую EMS SQL Management Studio для SQL Server, потому что там я могу более четко видеть, что узкие разделы моего кода и визуальный дизайн в этой среде дают мне легче

У меня есть проект с открытым исходным кодом (лицензирован под LGPL), который пытается решить проблемы, связанные с правильной версией схемы DB для (и более) SQL Server (2005/2008/Azure), bsn ModuleStore . Весь процесс очень близок к понятию, объясненному сообщением Филиппа Келли здесь.

В принципе, отдельная часть набора инструментов скриптирует объекты базы данных SQL Server схемы БД в файлы со стандартным форматированием, поэтому содержимое файла изменяется только в том случае, если объект действительно изменился (в отличие от сценариев сделанный VS, который также создает скрипты и т.д., отмечая все измененные объекты, даже если они фактически идентичны).

Но набор инструментов выходит за рамки этого, если вы используете.NET: он позволяет встраивать скрипты SQL в библиотеку или приложение (в виде встроенных ресурсов), а затем сравнивать сравниваемые встроенные скрипты с текущим состоянием в базе данных. Изменения, не связанные с таблицей (те, которые не являются "деструктивными изменениями" по определение Мартина Фаулера), могут применяться автоматически или по запросу (например, создание и удаление объектов, таких как представления, функции, хранимые процедуры, типы, индексы) и сценарии изменения (которые необходимо записать вручную) могут быть применены в том же процессе; также создаются новые таблицы, а также их установочные данные. После обновления схема БД снова сравнивается с сценариями, чтобы обеспечить успешное обновление БД до того, как изменения будут совершены.

Обратите внимание, что весь код сценариев и сравнения работает без SMO, так что у вас нет болезненной зависимости SMO ​​при использовании модуля bsn ModuleStore в приложениях.

В зависимости от того, как вы хотите получить доступ к базе данных, набор инструментов предлагает еще больше - он реализует некоторые возможности ORM и предлагает очень хороший и полезный интерфейсный подход для вызова хранимых процедур, включая прозрачную поддержку XML с собственным.NET XML классов, а также для TVP (Table-Valued Parameters) как IEnumerable

Вот мой script для отслеживания хранимых proc и udf и триггеров в таблице.

    Создайте таблицу для хранения существующего исходного исходного кода proc

    Ввести таблицу со всеми существующими данными триггера и script

    Создайте триггер DDL для отслеживания изменений на них

    /****** Object: Table . Script Date: 9/17/2014 11:36:54 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE . ( IDENTITY(1, 1) NOT NULL , (1000) NULL , (1000) NULL , (1000) NULL , (1000) NULL , NULL , NTEXT NULL ,CONSTRAINT PRIMARY KEY CLUSTERED ( ASC) WITH (PAD_INDEX = OFF ,STATISTICS_NORECOMPUTE = OFF ,IGNORE_DUP_KEY = OFF ,ALLOW_ROW_LOCKS = ON ,ALLOW_PAGE_LOCKS = ON) ON ) ON GO ALTER TABLE . ADD CONSTRAINT DEFAULT("") FOR GO INSERT INTO . ( , , , , ,) SELECT "sa" ,"loginitialdata" ,r.ROUTINE_NAME ,r.ROUTINE_TYPE ,GETDATE() ,r.ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES r UNION SELECT "sa" ,"loginitialdata" ,v.TABLE_NAME ,"view" ,GETDATE() ,v.VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS v UNION SELECT "sa" ,"loginitialdata" ,o.NAME ,"trigger" ,GETDATE() ,m.DEFINITION FROM sys.objects o JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.type = "TR" GO CREATE TRIGGER ON DATABASE FOR CREATE_PROCEDURE ,ALTER_PROCEDURE ,DROP_PROCEDURE ,CREATE_INDEX ,ALTER_INDEX ,DROP_INDEX ,CREATE_TRIGGER ,ALTER_TRIGGER ,DROP_TRIGGER ,ALTER_TABLE ,ALTER_VIEW ,CREATE_VIEW ,DROP_VIEW AS BEGIN SET NOCOUNT ON DECLARE @data XML SET @data = Eventdata() INSERT INTO sysupdatelog VALUES (@data.value("(/EVENT_INSTANCE/LoginName)", "nvarchar(255)") ,@data.value("(/EVENT_INSTANCE/EventType)", "nvarchar(255)") ,@data.value("(/EVENT_INSTANCE/ObjectName)", "nvarchar(255)") ,@data.value("(/EVENT_INSTANCE/ObjectType)", "nvarchar(255)") ,getdate() ,@data.value("(/EVENT_INSTANCE/TSQLCommand/CommandText)", "nvarchar(max)")) SET NOCOUNT OFF END GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO ENABLE TRIGGER ON DATABASE GO

С выходом SQL Server 2005 разработчики и администраторы баз данных (DBA) получат целый комплект новых средств управления. Версия SQL Server 2005 отличается не только набором добавленных в нее новых служб; при разработке этого продукта создание новых инструментов управления для DBA тоже было одной из важнейших задач. На смену SQL Server 2000 Enterprise Manager и Query Analyzer пришел новый программный инструмент - SQL Server Management Studio. Еще необходимо упомянуть о двух новых вспомогательных средствах: SQL Server Configuration Manager и Surface Area Configuration tool. Прежде чем приступать к рассмотрению возможностей SQL Server Management Studio, давайте познакомимся с каждым из этих инструментов.

Средства управления конфигурацией

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

SQL Server Configuration Manager. Этот инструмент помогает управлять учетными записями различных служб SQL Server 2005 на сервере, а также самими этими службами. Непосредственно из SQL Server Management Studio можно запускать и устанавливать службы SQL Server 2005, подобно тому как это раньше делалось с помощью Enterprise Manager, так что заново изучать SQL Server Configuration Manager не придется. Данная программа может быть вызвана через меню Start в Windows или через Computer Management в меню Administrative Tools. А чтобы запустить SQL Server Management Studio, который мы рассмотрим в следующем разделе, можно воспользоваться диалоговым окном Management Studio Registered Servers.

SQL Server Configuration Manager используется для управления службами SQL Server, сетевыми библиотеками и SQL Native Client (см. экран 1 ). Здесь можно устанавливать и изменять параметры учетных записей служб, а также включать или отключать эти службы. Данный инструмент частично перекрывает функции двух других средств, которые осуществляют управление этими службами и другими функциями с точки зрения управления защитой от возможных угроз.

Средства настройки. В SQL Server 2005 появилось много новых служб. Теперь, в дополнение к стандартным службам, таким как SQL Server, SQL Agent и Analysis Server, можно еще управлять параметрами службы SQL Server Integration Services (ранее Data Transformation Services, DTS), Reporting Services, Full-Text Search и SQL Browser.

При установке SQL Server 2005 эти службы представляют собой объект для потенциальных атак. Для принятия мер по минимизации поверхности атаки Microsoft предлагает два новых средства настройки, одно из которых предназначено для управления службами, а другое - для настройки параметров соединений. На конечной стадии процесса установки SQL Server 2005 имеются ссылки на эти программы, они также доступны через меню Start. С помощью этих инструментов можно контролировать те службы и функции, которые представляют собой потенциально уязвимые места для атак на SQL Server, любую из этих служб можно включать или отключать непосредственно из этих программ.

С помощью утилиты Surface Area Configuration for Services and Connections можно запускать и отключать различные службы (см. экран 2 ). Здесь же можно управлять статусом службы SQL Browser, которая работает через порт UDP 1434 и преобразует соединения в именованные объекты.

Программа Surface Area Configuration for Features, окно которой показано на экране 3 , позволяет управлять соединениями, в том числе специализированными удаленными запросами, настройками CLR, хранимыми процедурами Database Mail (SMTP), удаленными выделенными административными подключениями (Dedicated Administrator Connections), конечными точками служб Web (SOAP), OLE-автоматизацией расширенных хранимых процедур, конечными точками Service Broker, хранимыми процедурами SQL Mail (MAPI), xp_cmdshell и Web Assistant. Все эти функции по умолчанию отключены и должны активизироваться выборочно, по мере необходимости. Для включения многих из этих функций можно использовать системную хранимую процедуру sp_configure, с ее помощью также можно задействовать наиболее важные команды T-SQL на конечных точках.

Management Studio

В SQL Server 2005 появилось новое консолидированное средство управления - SQL Server Management Studio. Это всеобъемлющий инструмент, в котором объединены функции, актуальные для DBA и для разработчиков. Management Studio представляет собой комплексное программное средство, которое содержит столько возможностей, что для их подробного описания одной статьи явно недостаточно. Что касается наиболее значительных новшеств и изменений, имеющихся в данном продукте, то их можно описать тремя фразами: управление сервером, редактирование запросов и анализ производительности.

Management Studio - это огромный «ящик с инструментами»: разработчики Microsoft тщательно отобрали лучшие функции администрирования из Enterprise Manager и лучшие функции анализа и редактирования запросов из Query Analyzer, а затем соединили их в новом программном средстве. Далее в статье мы бросим беглый взгляд на эти новые возможности.

Запустив оболочку Management Studio в первый раз, вы обнаружите в ней сходство с Visual Studio. Но несмотря на то что Management Studio базируется на оболочке Visual Studio и имеет с ней некоторое внешнее сходство, это обманчивое впечатление: Management Studio представляет собой абсолютно новое программное средство, разработанное с использованием управляемого кода.

Сразу становится очевидно, что это два типа диалогов: центральная, не перемещаемая часть окна Management Studio Window называется областью окна документа, а объекты, размещаемые по краям, называются компонентами. Изначально в окне документа по умолчанию отображается страница сводки (Summary), содержащая некоторые отчетные данные о зарегистрированных серверах SQL Server. При первом запуске Management Studio в левой части будут отображаться диалоги компонентов Registered Servers и Object Explorer, а окно документа, справа, будет содержать страницу Summary (см. экран 4 ). Здесь отображается предлагаемый по умолчанию набор компонентов, но его можно изменить, добавив нужные компоненты в выбранные места. Страница Summary может содержать перечень компонентов узла Object Explorer или формировать отчет по выбранному узлу. Некоторое время поработав с компонентами, вы познакомитесь с третьим типом диалогов, так называемыми немодальными диалоговыми окнами, которые не связаны с основным окном Management Studio.

Как и в Visual Studio, каждое из окон компонентов является фиксируемым и скрываемым (hideable). С помощью значка канцелярской кнопки, имеющегося в панели кнопок каждого из окон, можно включить функцию автоматического скрытия (auto-hide), еще до нее можно добраться, щелкнув правой кнопкой мыши в самом верху окна. Скрываемые автоматически окна удобны в тех случаях, когда требуется дополнительное экранное пространство для расширения Object Browser, авторизующих запросов (authoring queries) и т. д. Характер представления этих окон можно изменить, нажав кнопку Window Position (кнопка с изображением небольшой треугольной стрелки, направленной вниз, которая имеется в правом верхнем углу каждого из окон компонентов).

Через меню View можно задействовать многие другие окна компонентов. Для целей администрирования наиболее актуальны активные по умолчанию окна Registered Servers и Object Explorer. Что касается окон компонентов Solution Explorer, Template Explorer и Properties, то они больше пригодятся для редактирования запросов и анализа. В Management Studio запоминается последнее отображение и параметры конфигурации окна, поэтому все они сохранятся при следующем запуске программы. Если нужно сбросить настройки окна в состояние по умолчанию, то в меню Window следует выбрать пункт Reset Window.

В Management Studio реализована поддержка администрирования и редактирования сценариев для многих элементов: экземпляров базы данных SQL Server, вместе с Analysis Services, Report Services, Integration Services и SQL Server Mobile. Все эти типы служб могут регистрироваться через Management Studio с помощью Register Servers, а затем их можно администрировать с помощью Object Explorer. Здесь можно редактировать сценарии T-SQL, сценарии Analysis Services и сценарии SQL Server Mobile, а также объединять их в проекты с помощью окна Solution Explorer, что будет показано в разделе, посвященном редактированию запросов.

Администрирование

Для того чтобы в полной мере оценить те новые возможности, которые получили администраторы баз данных с появлением Management Studio, сначала сравним Management Studio с Enterprise Manager, стандартным средством администрирования в SQL Server 2000. Программа Enterprise Manager представляет собой встроенную в SQL Server 2000 графическую утилиту, предназначенную для выполнения задач администрирования сервера баз данных. Данной утилите присущ ряд недостатков, в частности с ее помощью можно управлять только реляционным механизмом SQL Server и службой SQL Agent, но не службой Analysis Services. Кроме того, Enterprise Manager не может эффективно отображать большое количество серверов, баз данных или объектов баз данных. Вторая проблема заключается в том, что для решения многих задач здесь используются модальные диалоги, поэтому после запуска какой-либо процедуры, например резервного копирования, часто приходится запускать еще одну копию Enterprise Manager для продолжения наблюдения за сервером. И наконец, Enterprise Manager - это оснастка Microsoft Management Console (MMC), что обусловливает не слишком стабильную работу данного приложения и имеющие место весьма неприятные сбои, а порой оно просто перестает отвечать.

Все упомянутые ограничения в Management Studio устранены. Отсюда можно администрировать не только экземпляры реляционного механизма, но также и Analysis Services. Management Studio использует новый прикладной интерфейс SQL Management Objects (SMO) API, что обеспечивает эффективное управление большим количеством объектов баз данных. И наконец, везде, где это возможно, используются немодальные диалоги, разработанные с использованием стабильного управляемого кода.

Registered servers. В Management Studio, в отличие от Enterprise Manager, окно, предназначенное для регистрации серверов и их организации, отделено от окна просмотра серверных объектов. Информацию о зарегистрированных серверах или группах серверов можно экспортировать в конфигурационный файл формата XML и далее импортировать на тот же самый или какой-либо другой сервер, просто щелкнув правой кнопкой на соответствующем зарегистрированном сервере или группе серверов и выбрав пункт Export.

Кроме того, в SQL Server 2005 также разнесены функции управления службами SQL Server и функции управления сервером. Например, из Registered Servers нельзя запускать или останавливать службы - для этих целей предназначен компонент SQL Server Configuration Manager. Также в Management Studio разделены процедуры регистрации сервера, подключения к серверу и просмотра объектов сервера. Разумеется, в ходе регистрации сервера через окно Registered Servers устанавливается кратковременное соединение с сервером в целях проверки, но данное соединение не поддерживается постоянно. Тем не менее, если щелкнуть правой кнопкой мыши на зарегистрированном сервере, а затем выбрать пункт Object Explorer или New Query, то информация о соединении, сохраненная вместе с информацией о зарегистрированном сервере, будет использоваться SQL Server в дальнейшем для установления соединений с данным сервером.

Object Explorer. Это основной инструмент для организации объектов сервера. Object Explorer предоставляет не только функции администрирования, но и возможности редактирования запросов. Если поглубже заглянуть внутрь процессора баз данных SQL Server 2005, то можно, например, увидеть, что результирующее дерево параметров имеет сходство с Enterprise Manager. Однако здесь еще можно регистрировать экземпляры Analysis Services и управлять ими, что не было предусмотрено в классическом Enterprise Manager.

Для каждого из узлов, отображаемых в дереве Object Explorer, могут вызываться различные административные диалоги. Например, если щелкнуть правой кнопкой мыши на имени сервера баз данных, будет вызвано немодальное диалоговое окно Server Properties с несколькими закладками, с помощью которого можно просматривать и изменять конфигурацию параметров администрирования для данного сервера.

Когда будет развернут узел Object Explorer на уровне SQL Server database engine, обратите внимание, что SQL Agent имеет собственный узел и все объекты кода T-SQL подпадают под категорию узла Programmability, который имеет в своем составе узел для размещения сборок (assembly). Если развернуть дерево на уровне Analysis Server, то здесь вы также увидите новый узел, предназначенный для размещения хранимых процедур, которые тоже являются сборками.

Диалоговые окна Object Explorer базируются на SMO, который пришел на смену SQL-DMO, реализованному в SQL Server 2000, и представляет собой усовершенствованную объектную модель, обладающую большей гибкостью. SMO работает в асинхронном режиме, что позволяет открывать узел сервера и работать со многими объектами или методами, не оказывая влияния на другие функции. Допустим, мы открываем базу данных, содержащую сотни или даже тысячи таблиц, и в то время, пока она открывается, можем открыть еще один узел и выполнить какую-либо другую работу. Также следует упомянуть, что SMO содержит все необходимые механизмы для работы со сценариями, что позволяет автоматизировать с помощью сценариев практически любые действия, выполняемые в Object Explorer.

Выполнение задач администрирования

В Object Explorer системные объекты отделены от объектов пользовательской категории. Например, системные базы данных (master, model, msdb и tempdb) относятся к категории System Databases, в то время как новые учебные базы данных, AdventureWorks и AdventureWorksDW, являются пользовательскими. Здесь следует иметь в виду, что учебные базы данных по умолчанию не устанавливаются, поэтому, если в ходе установки продукта не был выбран соответствующий параметр, по ее окончании у вас не будет ни одной доступной пользовательской базы.

Как и в случае установки свойств сервера, можно настраивать параметры базы данных, вызвав окно Database Properties. В Management Studio также поддерживаются средства проектирования таблиц и представлений (известные в SQL Server 2000 как Visual Data Tools), в том числе инструмент Database Diagrams. В те диалоговые окна, которые предназначены для работы с объектами баз данных, теперь встроен механизм поддержки сценариев, так что любые действия здесь могут быть автоматизированы с помощью сценариев (см. экран 5 ).

Компонент Object Explorer в Management Studio содержит узлы, предназначенные для управления параметрами безопасности. Также можно управлять унаследованными от SQL Server 2000 пакетами DTS, службами Notification Services, триггерами уровня базы данных, Database Mail и триггерами DDL уровня сервера.

Как можно было ожидать, в Management Studio встроены механизмы управления SQL Server Agent, но при этом сюда добавлен новый узел для управления SQL Server Agent Proxy (посредник SQL Server Agent). Через SQL Server Agent Proxy для каждого отдельного шага задания может определяться соответствующий контекст безопасности, это достигается путем предоставления посредников безопасности пользователю Windows компонентом SQL Agent. Обычно в заданиях T-SQL на уровне шагов посредники не используются, и тем не менее с их помощью в заданиях можно пошагово назначать посредников для элементов управления Active X, операций xp_cmdshell, репликаций, а также служб Analysis Services, SQL Server и SQL Server Integration Services.

Редактирование запросов

Помимо большого количества новых административных функций, в Management Studio появилась полнофункциональная среда для работы с запросами, существенно превосходящая по функциональности Query Analyzer из SQL Server 2000.

SQL Server 2000 Query Analyzer больше всего подходит для редактирования кода T-SQL и сценариев. И хотя в Query Analyzer имеется прекрасный редактор T-SQL, тем не менее ему свойствен ряд ограничений. В частности, с его помощью нельзя редактировать другие типы сценариев SQL Server, например такие, как запросы MDX. Если в Query Analyzer выполняется редактирование запроса или сценария, то при этом окно редактирования должно иметь соединение с SQL Server, причем подключиться к другому серверу в данном сеансе редактирования нельзя. Что касается графика плана исполнения, то возможности Query Analyzer прекрасно подходят для анализа хода выполнения запроса, однако графическое представление выходных данных не переносимо. Кроме того, хотя в Query Analyzer можно редактировать сценарии T-SQL, находящиеся на диске в виде файлов, в SQL Server 2000 отсутствует интерфейс прямого доступа к программам контроля версий. И последнее. Хотя с помощью инструмента Object Browser, имеющегося в Query Analyzer, можно выполнять в базе данных поиск объектов кода T-SQL, его нельзя использовать ни для каких задач, связанных с управлением базой данных.

Что касается возможностей редактирования в Query Analyzer, то практически все они сохранились и в Management Studio, но в новом продукте все описанные выше ограничения устранены. С помощью Management Studio можно редактировать все типы сценариев SQL Server, причем не только написанные на T-SQL, но и XML-сценарии. При редактировании запросов необязательно иметь постоянное соединение с сервером, теперь это можно делать и в автономном режиме либо в ходе сеанса переключиться на другой сервер, на котором данный запрос должен быть выполнен. Полученное в Management Studio графическое отображение плана исполнения на выходе может быть передано в другой сеанс Management Studio, соответственно можно работать с полученными результатами без необходимости подключения к исходному серверу. Имеющийся в Management Studio компонент Object Explorer содержит всю функциональность Object Explorer из Query Analyzer, но здесь также в полном объеме реализована поддержка функций администрирования.

Работа в автономном режиме. Для запуска нового запроса в Management Studio существует несколько способов. При выборе из меню File пункта New можно создавать запросы трех типов: запрос T-SQL, запрос Analysis Services MDX, DMS или XMLA либо запрос SQL Server Mobile. Кроме того, созданные запросы можно запускать из Object Explorer или Solution Explorer, о чем мы поговорим далее.

Процесс редактирования запросов в Management Studio является независимым от соединения. Запросы можно запускать, имея подключение к серверу, не имея его сначала и установив в нужный момент либо переключаться на другой сервер для выполнения этого же запроса. Это дает возможность наиболее естественным образом использовать предусмотренную в SQL Server 2000 практику редактирования запросов из сценариев и текстовых файлов. При переходе в режим редактирования появится несколько дополнительных пиктограмм редактирования запросов, предназначенных, в частности, для установки, разрыва и изменения соединения. При редактировании запросов в Management Studio можно задействовать функцию auto-hide для окна Object Browser, тогда освободится дополнительное пространство экрана для редактирования.

Решения и проекты. Management Studio имеет расширенные возможности редактирования, он позволяет объединять созданные сценарии и текстовые файлы в приложения (solution) и проекты (project). Проект представляет собой именованную коллекцию сценариев и текстовых файлов, которые обычно размещаются в стандартном каталоге Windows, имеющем то же имя, что и сам проект. Приложение - это набор из одного или более проектов, при этом все проекты, входящие в состав данного приложения, могут быть включены в каталог с именем, соответствующим имени приложения, но могут быть и приложения, содержащие только один проект и, соответственно, имеющие один вариант размещения. Для создания нового проекта в Management Studio нужно выбрать меню File, затем New, Project, при этом запускается диалоговое окно New Project.

В Management Studio по умолчанию приложению присваивается то же имя, что и проекту, а размещаются приложение и проект в каталоге My Documents. В тех случаях когда необходимо объединить большое количество сценариев в один крупный проект, который желательно разбить на несколько подчиненных проектов (sub-project), можно собрать несколько проектов в одно приложение с осмысленным именем и задать для него необходимое размещение. При этом сначала создается новый проект, а затем указывается приложение, в состав которого он должен быть включен. Имя, присваиваемое решению по умолчанию, может быть изменено. После того как были созданы проект и соответствующее решение, можно осуществлять навигацию по приложению и входящим в него проектам с помощью компонента Solution Explorer, как показано на экране 6 .

Предположим, требуется модифицировать несколько объектов, относящихся к схеме AdventureWorks HumanResources. При этом часть сценариев будет модифицировать таблицы, часть - представления, а какие-то из них будут изменять код хранимых процедур. Сценарии каждого из этих типов могут быть объединены в соответствующие проекты, а проекты затем объединяются в приложение. Один из способов реализации описанного подхода показан на экране 6: здесь приложение с именем soln_HR содержит несколько проектов, каждый из которых соответствует определенному типу вносимых в схему HR изменений.

Используя функциональность приложений и проектов, можно создавать наборы сценариев для SQL Server Analysis Services или для SQL Mobile, группируя их в собственные проекты. Наборы, определяемые как проекты, будут помещаться в соответствующие каталоги на диске и отображаться в Solution Explorer в виде отдельных узлов. Каждому проекту можно назначить имя и указать папку для размещения на диске. По умолчанию каталог проекта размещается внутри каталога приложения, и все файлы данного проекта будут храниться в этом каталоге.

Возможность организации файлов в проекты и приложения - это только одно из преимуществ новой технологии работы со сценариями в SQL Server. Кроме этого, Management Studio имеет тесную взаимосвязь с программами проверки исходного кода, если данная система контроля исходного кода является подключаемым модулем. В пакете Visual SourceSafe (VSS) имеется однозначное соответствие между проектами VSS и проектами Management Studio, поэтому после создания проекта и приложения в Management Studio приложение целиком можно загрузить в VSS для выполнения соответствующей проверки, а затем выполнять проверку на уровне отдельных проектов или файлов. Для доступа к функциям загрузки в систему контроля кода следует щелкнуть правой кнопкой на любом узле в Solution Explorer. Настроить параметры проверки кода можно в диалоговом окне Options, которое вызывается из меню Tools программы Management Studio. В этом же окне (Tools, Options) можно включить некоторые другие функции редактирования, такие как нумерация строк и динамическая справка.

Интерактивная работа со сценариями баз данных. Для редактирования в базе данных объектов T-SQL можно использовать Object Explorer. Когда вы попадаете внутрь программируемого объекта базы данных, такого как хранимая процедура, функция или триггер, вы можете вызвать редактор запросов T-SQL, для чего требуется выбрать New или Modify. Если выбрано New, тогда будет использоваться шаблон, параметры которого можно просматривать и изменять с помощью компонента Template Explorer. При выборе варианта Modify генерируется сценарий ALTER, соответствующий выбранному объекту. Функции New и Modify заменили компоненты Assisted Editor, существовавшие в ранних бета-версиях Management Studio для SQL Server 2005.

Усовершенствования для плана исполнения. Management Studio имеет два существенных расширения, связанных с возможностями просмотра планов. Здесь, как и в Query Analyzer, можно просматривать графический вариант плана исполнения, однако и сами пиктограммы, и цветовая гамма претерпели изменения. Кроме того, теперь большая часть пиктограмм показывает детали той операции, которую SQL Server выполняет в настоящий момент. Если нажать на значок с символом «+» в правом нижнем углу окна запроса на план исполнения, то можно перейти к увеличенному отображению запроса. А если выбрать какой-либо из узлов запроса на план исполнения, то в диалоговом окне Properties будет отображена дополнительная информация об этом действии.

Я думаю, многим понравится новая возможность, появившаяся в Management Studio, позволяющая сделать графическое изображение плана исполнения переносимым. Начать можно с прямого вывода в XML с помощью SET SHOWPLAN_XML ON. Если результаты запроса передаются в контейнер, тогда результирующий набор данных будет включать ссылку на документ XML, содержащий информацию о плане исполнения. Если щелкнуть по этой ссылке, то можно просмотреть содержимое плана исполнения в редакторе XML Management Studio.

В целях графического просмотра данные XML можно экспортировать в переносимый (portable) формат. В полученном наборе данных нужно щелкнуть правой кнопкой на ссылке XML и сохранить данные в виде файла с расширением.sqlplan, как показано на экране 7 . Если открыть сохраненный файл через пункт Open меню File, то Management Studio отобразит XML-документ в виде графического изображения плана исполнения, как показано на экране 8 .

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

Соберем все вместе

Имеющийся в SQL Server 2005 инструментарий существенно расширяет возможности как управления, так и разработки. Например, интерфейс SQL Server Management Studio является настраиваемым, поэтому в каждом случае можно для себя решить, какие функции являются самыми необходимыми, и, соответственно, скрыть те функции, которые не будут использоваться в работе. Разумеется, в процессе освоения новых инструментов работы можно столкнуться с неизбежными в ходе обучения проблемами, но, как сказал поэт, «не пропадет ваш скорбный труд».

Кэлен Дилани - Независимый консультант и инструктор по SQL Server. Имеет сертификаты MCT и MCSE. Автор книги Inside SQL Server 2000 (Microsoft Press). [email protected]

Рон Талмадж - Владелец и руководитель Prospice LLC, консалтинговой компании в области баз данных из Сиэтла. Руководитель группы Pacific Northwest SQL Server Users Group, имеет сертификаты MCSD и MCP в SQL Server, ведет рассылку PASSnews и является SQL Server MVP. Написал Microsoft SQL Server 7.0 Administrator?s Guide (издательство Prima).

Среда SQL Server Management Studio имеет два основных назначения: администрирование серверов баз данных и управление объектами баз данных. Эти функции рассматриваются далее.

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

Задачи администрирования, которые можно выполнять с помощью среды SQL Server Management Studio, включают, среди прочих, следующие:

    регистрация серверов;

    подключение к серверу;

    создание новых групп серверов;

    управление множественными серверами;

    пуск и остановка серверов.

Эти задачи администрирования описываются в следующих подразделах.

Регистрация серверов

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

Сервер можно зарегистрировать при первом запуске среды SQL Server Management Studio или позже. Чтобы зарегистрировать сервер базы данных, щелкните правой кнопкой требуемый сервер в обозревателе объектов и в контекстном меню выберите пункт Register. Если панель обозревателя объектов скрыта, то откройте ее, выполнив команду меню View --> Object Explorer. Откроется диалоговое окно New Server Registration (Регистрация нового сервера), как это показано на рисунке ниже:

Выберите имя сервера, который нужно зарегистрировать, и тип проверки подлинности для этого сервера (т.е. проверка подлинности Windows или проверка подлинности SQL Server), после чего нажмите кнопку Save.

Подключение к серверу

Среда SQL Server Management Studio также разделяет задачи регистрации сервера и подключения к серверу. Это означает, что при регистрации сервера автоматического подключения этого сервера не происходит. Чтобы подключиться к зарегистрированному серверу, нужно щелкнуть правой кнопкой требуемый сервер в окне инспектора объектов и в появившемся контекстном меню выбрать пункт Connect (Подключиться).

Создание новой группы серверов

Чтобы создать новую группу серверов в панели зарегистрированных серверов, щелкните правой кнопкой узел Local Server Groups (Группы локальных серверов) в окне Registered Server и в контекстном меню выберите пункт New Server Group (Создание группы серверов). В открывшемся диалоговом окне New Server Group Properties (Свойства новой группа серверов) введите однозначное имя группы и, по выбору, ее описание.

Управление множественными серверами

Посредством обозревателя объектов среда SQL Server Management Studio позволяет администрировать множественные серверы баз данных (называемые экземплярами) на одном компьютере. Каждый экземпляр компонента Database Server имеет свой собственный набор объектов баз данных (системные и пользовательские базы данных), который не разделяется между экземплярами.

Для управления сервером и его конфигурацией щелкните правой кнопкой имя сервера в обозревателе объектов и в появившемся контекстном меню выберите пункт Properties (Свойства). Откроется диалоговое окно Server Properties (Свойства сервера), содержащее несколько страниц, таких как General (Общие), Security (Безопасность), Permissions (Разрешения) и т.п.

На странице General отображаются общие свойства сервера:

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

Можно изменить имя сервера, присвоив ему новое имя. Для этого щелкните правой кнопкой требуемый сервер в окне обозревателя объектов и в контекстном меню выберите пункт Register. Теперь можно присвоить серверу новое имя и изменить его описание. Серверы не следует переименовывать без особой на это надобности, поскольку это может повлиять на другие серверы, которые ссылаются на них.

Запуск и останов серверов

Сервер Database Engine по умолчанию запускается автоматически при запуске операционной системы Windows. Чтобы запустить сервер с помощью среды SQL Server Management Studio, щелкните правой кнопкой требуемый сервер в инспекторе объектов и в контекстном меню выберите пункт Start (Запустить). Это меню также содержит пункты Stop (Остановить) и Pause (Приостановить) для выполнения соответствующих действий с сервером.

Управление базами данных посредством обозревателя объектов Object Explorer

Задачи администрирования, которые можно выполнять с помощью среды SQL Server Management Studio, включают:

    создание баз данных, не прибегая к использованию языка Transact-SQL;

    модифицирование баз данных, не прибегая к использованию языка Transact-SQL;

    управление таблицами, не прибегая к использованию языка Transact-SQL;

    создание и исполнение инструкций SQL (описывается в следующей статье).

Создание баз данных без использования T-SQL

Новую базу данных можно создать посредством обозревателя объектов Object Explorer . Как можно судить по его названию, обозреватель объектов также можно использовать для исследования объектов сервера. С панели этого инструмента можно просматривать все объекты сервера и управлять сервером и базами данных. Дерево иерархии объектов сервера содержит, среди прочих папок, папку Databases (Базы данных). Эта папка, в свою очередь, содержит несколько подпапок, включая папку для системных баз данных, и по папке для каждой базы данных, созданной пользователем.

Чтобы создать базу данных посредством обозревателя объектов, щелкните правой кнопкой узел Databases и выберите пункт меню New Database (Создать базу данных). В открывшемся диалоговом окне New Database в поле Database name введите имя новой базы данных, после чего нажмите кнопку ОК.

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

Свойства файлов данных определенной базы данных перечисляются на странице Files (Файлы) и содержат такую информацию, как имя и начальный размер файла, расположение базы данных, а также тип файла (например, primary). База данных может храниться в нескольких файлах. В SQL Server применяется динамическое управление дисковым пространством. Это означает, что можно сконфигурировать размер базы данных для автоматического увеличения и уменьшения по мере надобности.

Чтобы изменить свойство Autogrowth (Автоувеличение) на странице Files, в столбце Autogrowth нажмите значок троеточия (...) и внесите соответствующие изменения в диалоговом окне Change Autogrowth. Чтобы позволить автоматическое увеличение размера базы данных, нужно установить флажок Enable Autogrowth . Каждый раз, когда существующий размер файла недостаточен для хранения добавляемых данных, сервер автоматически запрашивает систему выделить файлу дополнительное дисковое пространство. Объем дополнительного дискового пространства (в процентах или мегабайтах) указывается в поле File Growth (Увеличение размера файла) в том же диалоговом окне. А в разделе Maximum File Size (Максимальный размер файла) можно или ограничить максимальный размер файла, установив переключатель Limited to (MB) (Ограничение (Мбайт)), или снять ограничения на размер, установив переключатель Unlimited (Без ограничений) (это настройка по умолчанию). При ограниченном размере файла нужно указать его допустимый максимальный размер.

На странице Filegroups (Файловые группы) диалогового окна Database Properties отображаются имена файловых групп, к которым принадлежит файл базы данных, раздел файловой группы (по умолчанию или заданный явно), а также операции, разрешенные для выполнения с файловой группой (чтение и запись или только чтение).

На странице Options (Параметры) диалогового окна Database Properties можно просмотреть и модифицировать все параметры уровня базы данных. Существуют следующие группы параметров: Automatic (Автоматически), Containment (Включение), Cursor (Курсор), Miscellaneous (Вспомогательные), Recovery (Восстановление), Service Broker (Компонент Service Broker) и State (Состояние). Группа State содержит, например, следующие четыре параметра:

Database Read-Only (База данных доступна только для чтения)

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

Restrict Access (Ограничение доступа)

Устанавливает количество пользователей, которые могут одновременно использовать базу данных. Значение по умолчанию - MULTI_USER.

Database State (Состояние базы данных)

Описывает состояние базы данных. Значение по умолчанию этого параметра - Normal.

Encryption Enabled (Шифрование включено)

Определяет режим шифрования базы данных. Значение по умолчанию этого параметра - False.

На странице Extended Properties (Расширенные свойства) отображаются дополнительные свойства текущей базы данных. На этой странице можно удалять существующие свойства и добавлять новые.

На странице Permissions (Разрешения) отображаются все пользователи, роли и соответствующие разрешения.

Остальные страницы Change Tracking (Отслеживание изменений), Mirroring (Зеркальное отображение) и Transaction Log Shipping (Доставка журналов транзакций) описывают возможности, связанные с доступностью данных.

Модифицирование баз данных

С помощью обозревателя объектов можно модифицировать существующие базы данных, изменяя файлы и файловые группы базы данных. Чтобы добавить новые файлы в базу данных, щелкните правой кнопкой требуемую базу данных и в контекстном меню выберите пункт Properties. В открывшемся диалоговом окне Database Properties выберите страницу Files и нажмите кнопку Add, расположенную внизу раздела Database files. В раздел будет добавлена новая строка, в поле Logical Name которой следует ввести имя добавляемого файла базы данных, а в других полях задать необходимые свойства этого файла. Также можно добавить и вторичную файловую группу для базы данных, выбрав страницу Filegroups (Файловые группы) и нажав кнопку Add.

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

Чтобы удалить базы данных с помощью обозревателя объектов, щелкните правой кнопкой имя требуемой базы данных и в открывшемся контекстном меню выберите пункт Delete (Удалить).

Управление таблицами

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

Для практики создания таблиц, в базе данных SampleDb создадим таблицу Department. Чтобы создать таблицу базы данных с помощью обозревателя объектов, разверните в нем узел Databases, а потом узел требуемой базы данных, щелкните правой кнопкой папку Tables и в открывшемся контекстном меню выберите пункт New Table. В верхней части с правой стороны окна средства Management Studio откроется окно для создания столбцов новой таблицы. Введите имена столбцов таблицы, их типы данных и разрешение значений null для каждого столбца, как это показано в правой верхней панели на рисунке ниже:

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

Тип данных существующего столбца можно изменить на вкладке Column Properties (Свойства столбца) (нижняя панель на рисунке). Для одних типов данных, таких как char, требуется указать длину в строке Length, а для других, таких как decimal, на вкладке Column Properties требуется указать масштаб и точность в соответствующих строках Scale (Масштаб) и Precision (Точность). Для некоторых других, таких как int, не требуется указывать ни одно из этих свойств. (Недействительные значения для конкретного типа данных выделены затененным шрифтом в списке всех возможных свойств столбца.)

Чтобы разрешить значения null для данного столбца, следует установить для него соответствующий флажок поля. Также, если для столбца требуется значение по умолчанию, его следует ввести в строку Default Value or Binding (Значение по умолчанию или привязка) панели Column Properties. Значение по умолчанию присваивается ячейке столбца автоматически, если для нее явно не введено значение.

Столбец Number является первичным ключом таблицы Department. Чтобы сделать столбец первичным ключом таблицы, щелкните его правой кнопкой и в контекстном меню выберите пункт Set Primary Key (Задать первичный ключ).

Завершив все работы по созданию таблицы, щелкните крестик вкладки конструктора таблиц. Откроется диалоговое окно с запросом, сохранить ли сделанные изменения. Нажмите кнопку Yes, после чего откроется диалоговое окно Choose Name (Выбор имени) с запросом ввести имя таблицы. Введите требуемое имя таблицы и нажмите кнопку OK. Таблица будет сохранена под указанным именем. Чтобы отобразить новую таблицу в иерархии базы данных, в панели инструментов обозревателя объектов щелкните значок Renew (Обновить).

Для просмотра и изменения свойств существующей таблицы разверните узел базы данных, содержащей требуемую таблицу, разверните узел Tables в этой базе данных и щелкните правой кнопкой требуемую таблицу, а затем в контекстном меню выберите пункт Properties. В результате для данной таблицы откроется диалоговое окно Table Properties. Для примера, на рисунке ниже показано диалоговое окно Table Properties на вкладке General для таблицы Employee базы данных SampleDb.

Чтобы переименовать таблицу, в папке Tables щелкните ее правой кнопкой в списке таблиц и в контекстном меню выберите пункт Rename. А чтобы удалить таблицу, щелкните ее правой кнопкой и выберите пункт Delete.

Создав все четыре таблицы базы данных SampleDb (Employee, Department, Project и Works_on - подробную структуру таблиц вы можете найти в исходниках), можно использовать еще одну возможность среды SQL Server Management Studio, чтобы отобразить диаграмму типа "сущность - отношение" - диаграмму (ER) (entity-relationship) этой базы данных. (Процесс преобразования таблиц базы данных в диаграмму "сущность - отношение" (ER) называется обратным проектированием.)

Чтобы создать диаграмму ER для базы данных SampleDb, щелкните правой кнопкой ее подпапку Database Diagrams (Диаграммы баз данных) и в контекстном меню выберите пункт New Database Diagram (Создать диаграмму базы данных). Если откроется диалоговое окно, в котором спрашивается, создавать ли вспомогательные объекты, выберите ответ Yes.

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

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

Между таблицами базы данных SampleDb существует три отношения. Таблица Department имеет отношение типа 1:N с таблицей Employee, поскольку каждому значению первичного ключа таблицы Department (столбец Number) соответствует одно или более значений столбца DepartmentNumber таблицы Employee (в одном отделе может работать несколько сотрудников).

Аналогично существует отношение между таблицами Employee и Works_on, поскольку только значения, которые присутствуют в столбце первичного ключа таблицы Employee (Id) также имеются в столбце EmpId таблицы Works_on. Третье отношение существует между таблицами Project и Works_on, т.к. только значения, которые присутствуют в первичном ключе таблицы Project (Number) также присутствуют в столбце ProjectNumber таблицы Works_on.

Чтобы создать эти три отношения, диаграмму ER нужно реконструировать, указав для каждой таблицы столбцы, которые соответствуют ключевым столбцам других таблиц. Такой столбец называется внешним ключом (foreign key) . Чтобы увидеть, как это делается, определим столбец DepartmentNumber таблицы Employee, как внешний ключ таблицы Department. Для этого выполним следующие действия:


Подобным образом создаются и другие два отношения. На рисунке ниже показана диаграмма ER, отображающая все три отношения между таблицами базы данных SampleDb:

05.01.15 28.1K

Порой так хочется привести свои мысли в порядок, разложить их по полочкам. А еще лучше в алфавитной и тематической последовательности, чтобы, наконец, наступила ясность мышления. Теперь представьте, какой бы хаос творился в «электронных мозгах » любого компьютера без четкой структуризации всех данных и Microsoft SQL Server :

MS SQL Server

Данный программный продукт представляет собой систему управления базами данных (СУБД ) реляционного типа, разработанную корпорацией Microsoft . Для манипуляции данными используется специально разработанный язык Transact-SQL . Команды языка для выборки и модификации базы данных построены на основе структурированных запросов:


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

Обзор возможностей MS SQL Server


СУБД является частью длинной цепочки специализированного программного обеспечения, которое корпорация Microsoft создала для разработчиков. А это значит, что все звенья этой цепи (приложения ) глубоко интегрированы между собой.

То есть их инструментарий легко взаимодействует между собой, что во многом упрощает процесс разработки и написания программного кода. Примером такой взаимосвязи является среда программирования MS Visual Studio . В ее инсталляционный пакет уже входит SQL Server Express Edition .

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

Преимущества MS SQL Server :

  • Обладает высокой степенью производительности и отказоустойчивости;
  • Является многопользовательской СУБД и работает по принципу «клиент-сервер »;

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

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

Эволюция SQL Server

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

  • Microsoft SQL Server 1.0 – вышел еще в 1990 году. Уже тогда эксперты отмечали высокую скорость обработки данных, демонстрируемую даже при максимальной нагрузке в многопользовательском режиме работы;
  • SQL Server 6.0 – вышел в 1995 году. В этой версии впервые в мире была реализована поддержка курсоров и репликации данных;
  • SQL Server 2000 – в этой версии сервер получил полностью новый движок. Большая часть изменений коснулась лишь пользовательской стороны приложения;
  • SQL Server 2005 – увеличилась масштабируемость СУБД , во многом упростился процесс управления и администрирования. Был внедрен новый API для поддержки программной платформы .NET ;
  • Последующие выпуски – были направлены на развитие взаимодействия СУБД на уровне облачных технологий и средств бизнес-аналитики.

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


Диспетчер конфигурации. Позволяет управлять всеми сетевыми настройками и службами сервера базы данных. Используется для настройки SQL Server внутри сети.
  • SQL Server Error and Usage Reporting :


Утилита служит для настройки отправки отчетов об ошибках в службу поддержки Microsoft .


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

Набор утилит, входящих в Microsoft SQL Server , может отличаться в зависимости от версии и редакции программного пакета. Например, в версии 2008 года вы не найдете SQL Server Surface Area Configuration .

Запуск Microsoft SQL Server

Для примера будет использована версия сервера баз данных выпуска 2005 года. Запуск сервера можно произвести несколькими способами:

  • Через утилиту SQL Server Configuration Manager . В окне приложения слева выбираем «SQL Server 2005 Services », а справа — нужный нам экземпляр сервера БД . Отмечаем его и в подменю правой кнопки мыши выбираем «Start ».

  • С помощью среды SQL Server Management Studio Express . Она не входит в инсталляционный пакет редакции Express . Поэтому ее нужно скачивать отдельно с официального сайта Microsoft .

Для запуска сервера баз данных запускаем приложение. В диалоговом окне «Соединение с сервером » в поле «Имя сервера » выбираем нужный нам экземпляр. В поле «Проверка подлинности » оставляем значение «Проверка подлинности Windows ». И нажимаем на кнопку «Соединить »:

Основы администрирования SQL Server

Перед тем, как запустить MS SQL Server , нужно кратко ознакомиться с основными возможностями его настройки и администрирования. Начнем с более детального обзора нескольких утилит из состава СУБД :

  • SQL Server Surface Area Configuration – сюда следует обращаться, если нужно включить или отключить какую-либо возможность сервера баз данных. Внизу окна находятся два пункта: первый отвечает за сетевые параметры, а во втором можно активировать выключенную по умолчанию службу или функцию. Например, включить интеграцию с платформой .NET через запросы T-SQL :

Если вы уже когда-либо писали схемы блокировок на других языках баз данных для преодоления недостатка блокировок (как я), то у вас могло остаться чувство, что обязательно нужно самому заниматься блокировками. Позвольте вас заверить, что диспетчеру блокировок можно полностью доверять. Тем не менее SQL Server предлагает несколько методов управления блокировками, о которых мы детально поговорим в этом разделе.

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

Установка уровня изоляции подключения

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

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ Допустимыми уровнями изоляции являются:

Read uncommited ? serializable

Read commited ? snapshot

Repeatable read

Текущий уровень изоляции можно проверить с помощью команды проверки целостности базы данных (DBCC):

DBCC USEROPTIONS

Результаты будут следующими (сокращенно):

Set Option Value

isolation level repeatable read

Уровни изоляции могут быть также установлены на уровне запроса или таблицы с помощью параметров блокировки.

Использование изоляции уровня снимков базы данных

Существуют два варианта уровня изоляции снимков базы данных: snapshot и read commited snapshot. Изоляция snapshot работает подобно repeatable read, не занимаясь вопросами блокировки. Изоляция read commited snapshot имитирует установленный по умолчанию в SQL Server уровень read commited, так же снимая вопросы блокировки.

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

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

Использование изоляции Snapshot

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

ALTER DATABASE Aesop

SET ALLOW_SNAPSHOT_ISOLATION ON

| Для проверки того, включена ли в базе данных изоляция snapshot, выполните SVS следующий запрос: SELECT name, snapshot_isolation_state_desc FROM [ * sysdatabases.

Теперь первая транзакция начинает чтение и остается открытой (т.е. не подтвержденной): USE Aesop

BEGIN TRAN SELECT Title FROM FABLE WHERE FablelD = 2

Будет получен следующий результат:

В это время вторая транзакция начинает обновление той же строки, которая открыта первой транзакцией:

SET TRANSACTION ISOLATION LEVEL Snapshot;

BEGIN TRAN UPDATE Fable

SET Title = ‘Rocking with Snapshots’

WHERE FablelD = 2;

SELECT * FROM FABLE WHERE FablelD = 2

Результат следующий:

Rocking with Snapshots

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

SELECT Title FROM FABLE WHERE FablelD = 2

Результат следующий:

Если открыть третью и четвертую транзакции, то они увидят все то же исходное значение The Bald Knight:

Даже после того как вторая транзакция подтвердит изменения, первая будет по-прежнему видеть исходное значение, а все следующие транзакции - новое, Rocking with Snapshots.

Использование ИЗОЛЯЦИИ Read Commited Snapshot

Изоляция Read Commited Snapshot включается с помощью аналогичного синтаксиса:

ALTER DATABASE Aesop

SET READ_COMMITTED_SNAPSHOT ON

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

Так как Read Commited является уровнем изоляции, принятым в SQL Server по умолчанию, требуется только установка параметров базы данных.

Разрешение конфликтов записи

Транзакции, записывающие данные при установленном уровне изоляции Snapshot, могут быть заблокированы предыдущими неподтвержденными транзакциями записи. Такая блокировка не заставит новую транзакцию ожидать - просто будет сгенерирована ошибка. Для обработки подобных ситуаций используйте выражение try. . . catch, выждите пару секунд и попробуйте повторить транзакцию снова.

Использование параметров блокировки

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

Таблица 51.5. Параметры блокировки

Параметр

блокировки

Описание

Уровень изоляции. He устанавливает и не удерживает блокировку. Равносилен отсутствию блокировок

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

Уровень изоляции. Удерживает общую и эксклюзивную блокировки до момента подтверждения транзакции

Уровень изоляции. Удерживает общую блокировку до завершения транзакции

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

Включение блокировки на уровне строк вместо уровня страницы, экстента или таблицы

Включение блокировки на уровне страниц вместо уровня таблицы

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

Параметр

блокировки

Описание

Неприменение и неудержание блокировок. То же, что и ReadUnCommited

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

Удержание общей блокировки до подтверждения транзакции (аналогично Serializable)

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

Удержание эксклюзивной блокировки данных до подтверждения транзакции

В следующем примере в предложении FROM инструкции UPDATE использован параметр блокировки, запрещающий диспетчеру эскалировать гранулярность блокировки:

USE OBXKites UPDATE Product

FROM Product WITH (RowLock)

SET ProductName = ProductName + ‘ Updated 1

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

Ограничения блокировок уровня индексов

Уровни изоляции и параметры блокировки применяются на уровне подключений и запросов. Единственным способом управления блокировками на уровне таблицы является ограничение гранулярности блокировок на основе конкретных индексов. С помощью системной хранимой процедуры sp_indexoption блокировки строк и/или страниц можно отключить для конкретного индекса, используя следующий синтаксис: sp_indexoption ‘имя_индекса 1 ,

AllowRowlocks или AllowPagelocks,

Это может пригодиться в ряде особых случаев. Если таблица часто вызывает ожидания по причине блокировок страниц, то установка для параметра allowpagelocks значения off установит блокировку на уровне строк. Уменьшенная гранулярность блокировок положительно скажется на конкуренции. К тому же, если таблица редко обновляется, но часто считывается, блокировки на уровне строк и страниц нежелательны; в этом случае оптимальным является уровень блокировки на уровне таблиц. Если обновления выполняются нечасто, то эксклюзивная блокировка таблиц не приведет к большим проблемам.

Хранимая процедура Sp_indexoption предназначена для тонкой настройки схемы данных; именно поэтому в ней используется блокировка на уровне индексов. Для ограничения блокировок по первичному ключу таблицы используйте sp_help имя_ та блицы, чтобы найти имя индекса первичного ключа.

Следующая команда конфигурирует таблицу ProductCategory как редко обновляемый классификатор. Вначале команда sp_help выводит имя индекса первичного ключа таблицы: sp_help ProductCategory

Результат (усеченный) таков:

index index index

name description keys

PK_____________ ProductCategory 79A814 03 nonclustered, ProductCategorylD

unique, primary key located on PRIMARY

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

EXEC sp_indexoption

‘ProductCategory.РК__ ProductCategory_______ 7 9А814 03′,

‘AllowRowlocks’, FALSE EXEC sp_indexoption

‘ProductCategory.PK__ ProductCategory_______ 79A81403′,

‘AllowPagelocks’, FALSE

Управление временем ожидания блокировок

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

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

В следующем запросе время ожидания блокировки устанавливается в две секунды (2000 миллисекунд):

SET Lock_Timeout 2 00 0

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

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

Оценка производительности конкуренции в базе данных

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

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

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

Многопользовательскую конкуренцию лучше тестировать в процессе разработки несколько раз. Как говорится в экзаменационном руководстве MCSE, “не допускайте, чтобы тест в реальных условиях был первым”.

Блокировки приложения

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

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

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

Блокировка приложений может применяться в транзакциях; при этом может быть объявлен режим блокировки Shared, Update, Exclusive, IntentExclusice или IntentShared. Возвращаемое процедурой значение указывает, успешным ли было применение блокировки.

0. Блокировка установлена успешно.

1. Блокировка была установлена, когда другая процедура сняла свою блокировку.

999. Блокировка не была установлена по другой причине.

Хранимая процедура sp_ReleaseApLock снимает блокировку. В следующем примере продемонстрировано, как блокировка приложения может использоваться в пакете или процедуре: DECLARE @ShareOK INT EXEC @ShareOK = sp_GetAppLock

@Resource = ‘CableWorm’,

@LockMode = ‘Exclusive’

IF @ShareOK < 0

…Код обработки ошибки

… Программный код …

EXEC sp_ReleaseAppLock @Resource = ‘CableWorm’

Когда блокировки приложения просматриваются с помощью Management Studio или процедуры sp_Lock, они отображаются с типом АРР. В следующем листинге приведен сокращенный вывод процедуры sp_Lock, запущенной одновременно с приведенным выше кодом: spid dbid Objld Indld Type Resource Mode Status

57 8 0 0 APP Cabllf 94cl36 X GRANT

Следует обратить внимание на два небольших отличия в том, как блокировки приложения обрабатываются в SQL Server:

Взаимоблокировки не выявляются автоматически;

Если некоторая транзакция устанавливает блокировку несколько раз, она должна снять ее ровно такое же количество раз.

Взаимоблокировки

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

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

Раньше взаимоблокировки представляли собой серьезную проблему, но теперь SQL Server позволяет успешно разрешить ее.

Создание взаимоблокировки

Проще всего создать ситуацию взаимоблокировки в SQL Server с помощью двух подключений в редакторе запросов утилиты Management Studio (рис. 51.12). Первая и вторая транзакции пытаются обновить одни и те же строки, однако в противоположном порядке. Используя третье окно для запуска процедуры pGetLocks, можно выполнять мониторинг блокировок.

1. Создайте в редакторе запросов второе окно.

2. Поместите код блока Шаг 2 во второе окно.

3. В первое окно поместите код блока Шаг 1 и нажмите клавишу .

4. Во втором окне аналогично выполните код Шаг 2.

5. Вернитесь в первое окно и выполните код блока Шаг 3.

6. Через короткий промежуток времени SQL Server обнаружит взаимоблокировку и автоматически устранит ее.

Ниже приведен программный код примера.

– Транзакция 1 — Шаг 1 USE OBXKites BEGIN TRANSACTION UPDATE Contact

SET LastName = ‘Jorgenson’

WHERE ContactCode = 401′

Puc. 51.12. Создание ситуации взаимоблокировки в Management Studio с помощью двух подключений (их окна расположены вверху)

Теперь первая транзакция установила эксклюзивную блокировку на запись со значением 101 в поле ContactCode. Вторая транзакция установит эксклюзивную блокировку строки со значением 1001 в поле ProductCode, а затем попытается эксклюзивно заблокировать запись, уже заблокированную первой транзакцией (ContactCode=101).

– Транзакция 2 — Шаг 2 USE OBXKites BEGIN TRANSACTION UPDATE Product SET ProductName

= ‘DeadLock Repair Kit’

WHERE ProductCode = ‘1001’

SET FirstName = ‘Neals’

WHERE ContactCode = ‘101’

COMMIT TRANSACTION

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

Проблема возникает, когда транзакция 1 попытается обновить строку с ProductCode=l. Однако необходимую для этого эксклюзивную блокировку она не получит, поскольку эта запись заблокирована транзакцией 2:

– Транзакция 1 — Шаг 3 UPDATE Product SET ProductName

= ‘DeadLock Identification Tester’

WHERE ProductCode = ‘1001’

COMMIT TRANSACTION

Транзакция 1 вернет следующее текстовое сообщение об ошибке спустя пару секунд. Возникшую взаимоблокировку можно также увидеть в SQL Server Profiler (рис. 51.13):

Server: Msg 1205, Level 13,

State 50, Line 1 Transaction (Process ID 51) was

deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Транзакция 2 завершит свою работу, будто бы проблемы и не существовало:

(1 row(s) affected)

(1 row(s) affected)

Рис. 51.13. SQL Server Profiler позволяет выполнять мониторинг взаимоблокировок с помощью события Locks:Deadlock Graph и выявлять ресурс, вызвавший взаимоблокировку

Автоматическое выявление взаимоблокировок

Как было продемонстрировано в приведенном выше коде, SQL Server автоматически выявляет ситуацию взаимоблокировки, проверяя блокирующие процессы и откатывая транзакции,

выполнившие наименьший объем работы. SQL Server постоянно проверяет существование перекрестных блокировок. Задержка выявления взаимоблокировок может варьироваться от нуля до двух секунд (на практике дольше всего мне приходилось ожидать этого пять секунд).

Обработка взаимоблокировок

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

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

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

SET DEADLOCKJPRIORITY LOW

Минимизация взаимоблокировок

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

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

Никогда не ставьте код транзакции в зависимость от ввода пользователя.

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

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

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