Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

НОВЫЙ КУРС БД 2013

.pdf
Скачиваний:
15
Добавлен:
18.05.2015
Размер:
3.49 Mб
Скачать

количество оперативной памяти, доступной SQL Server, при помощи увеличения физической оперативной памяти на сервере или при помощи параметра MAX SERVER MEMORY;

4)Еще одна возможность справиться с неприятностями — использовать флаги трассировки. Флаги трассировки используются, чтобы включать или выключать определенное поведение в SQL Server. Установить флаг трассировки можно, используя DBCC TRACEON. С флагами трассировок можно ознакомится на сайте Microsoft в разделе MSDN.

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

http://www.rsdn.ru/article/db/mssqllocks.xml http://msdn.microsoft.com/ru-ru/library/ms190805.aspx http://msdn.microsoft.com/ru-ru/library/ms187373(v=sql.90).aspx http://www.sql.ru/articles/mssql/2004/04110303advancedlocking.shtml http://www.t-sql.ru/post/nolock.aspx

4.6Триггеры

4.6.1Общие сведения о триггерах и DDL триггеры

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

триггеры, срабатывающие при изменении данных, т.е. срабатывают при вызове UPDATE, INSERT или DELETE сценариев (триггеры языка описания данных Data Definition Language - DDL)

триггеры, срабатывающие при изменении метаданных, т.е. CREATE, ALTER, DROP сценариев (триггеры языка манипулирования данными Data Manipulation Language – DML)

DDL триггеры были впервые введены в 2005 версии SQL Server. Они необходимы, если нужно следить за внесением изменений в структуру базы данных и регистрировать хронологию этих изменений. Про DDL триггеры я расскажу кратко, а более подробно остановлюсь на DML триггерах. Итак, триггеры DDL создаются для определенной команды Transact-SQL, т.е. настраиваются на определенное событие в базе данных, например, создание таблицы или представления. При этом набор команд, для которых можно определить триггеры DDL, очень большой. Вот лишь некоторые из этих команд:

CREATE DATABASE, ALTER DATABASE, DROP DATABASE;

CREATE LOGIN, ALTER LOGIN, DROP LOGIN;

CREATE USER, ALTER USER, DROP USER;

CREATE TABLE, ALTER TABLE, DROP TABLE;

CREATE VIEW, ALTER VIEW, DROP VIEW;

CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE и т. п.

101

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

CREATE TRIGGER <имя триггера> ON DATABASE FOR [событие срабатывания] AS

<код триггера>

В самом простом варианте триггер DDL может выглядеть так:

CREATE TRIGGER MyDDLTrigger ON DATABASE FOR DROP_TABLE AS

PRINT 'Таблица была удалена'

Если выполнить эту команду в текущей базе данных, то при любом удалении таблицы в этой базе будет выдано сообщение 'Таблица была удалена'. Конечно, в реальной базе данных используют более функциональные триггеры, например, триггеры, отправляющие уведомления по электронной почте при помощи хранимых процедур Database Mail. В большинстве случаев требуется получить в триггере более подробную информацию о сути происходящих событий (например, чтобы отправить эту информацию по электронной почте). Для этого удобнее всего использовать специальную функцию EVENTDATA(). Например, чтобы получить информацию о конкретном запросе (с именем таблицы), который произвел ее удаление, можно использовать код вида:

CREATE TRIGGER MySecondDDL ON DATABASE FOR DROP_TABLE AS

SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar( max)')

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

CREATE TRIGGER MyNextDDL ON DATABASE FOR DROP_TABLE AS

PRINT ' далять таблицы в этой базе данных запрещено!';

ROLLBACK

Бывает необходимо, что триггер DDL или DML нужно на время отключить, можно воспользоваться командой DISABLE TRIGGER, например:

DISABLE TRIGGER <имя триггера> ON DATABASE

Удаление триггера DDL производится стандартной командой:

DROP TRIGGER <имя триггера> ON DATABASE

Я не буду подробно останавливаться на этом виде триггеров, поскольку этот вид триггеров нужен в основном для администрирования системы, нежели для обеспечения целостности данных. Данный вид триггеров выходит за рамки данной статьи. Информацию о них можно посмотреть здесь: http://msdn.microsoft.com/ru-ru/library/ms175941.aspx

102

4.6.2 DML триггеры

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

CREATE TRIGGER <имя триггера> ON [<имя схемы>.]<имя таблицы или представления> [WITH ENCRYPTION | EXECUTE AS <CALLER | SELF | <USER> >]

FOR | AFTER | INSTEAD OF [DELETE] [,] [NSERT] [,] [UPDATE] [WITH APPEND]

[NOT FOR REPLICATION] AS

<код триггера> | EXTERNAL NAME <ИМЯ МЕТОДА В СБОРКЕ>

Давайте рассмотрим этот длинный код. Синтаксис определения триггера похож на создание хранимой процедуры. При указании аргумента WITH ENCRYPTION сервер выполняет шифрование кода триггера, чтобы никто, включая администратора, не мог получить к нему доступ и прочитать его. Шифрование часто используется для скрытия авторских алгоритмов обработки данных, являющихся интеллектуальной собственностью программиста или коммерческой тайной. Аргумент WITH APPEND позволяет создавать несколько триггеров каждого типа. При создании триггера с аргументом NOT FOR REPLICATION запрещается его запуск во время выполнения модификации таблиц механизмами репликации. Конструкция AS <код триггера> определяет набор SQLкоманд, которые будут выполнены при запуске триггера. Отметим, что внутри триггера не допускается выполнение ряда операций, таких, например, как: создание, изменение и удаление базы данных; восстановление резервной копии базы данных или журнала транзакций. Выполнение этих команд не разрешено, так как они не могут быть отменены в случае отката транзакции, в которой выполняется триггер. После команды ON указывается имя таблицы или представления, на которое накладывается триггер. Опцию FOR | AFTER | INSTEAD OF [DELETE] [,] [NSERT] [,] [UPDATE] рассмотрим более подробно. Она указывает, при каких событиях должен срабатывать триггер. Т.е. мы можем указать как одно действие, так и все сразу через запятую. И прежде чем рассмотреть все эти действия обратимся к ключевым словам FOR, AFTER и INSTEAD OF. Ключевые слова FOR и AFTER работают одинаково и срабатывают сразу при модификации данных. Поэтому, какое слово использовать - разницы нет (чем это вызвано я объяснить не могу).Эти параметры определяют поведение триггеров:

AFTER (или FOR) триггер выполняется после успешного выполнения вызвавших его команд. Если же команды по какой-либо причине не могут быть успешно завершены, триггер не выполняется. Следует отметить, что изменения данных в результате

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

изменения. Можно определить

несколько AFTER -триггеров

для каждой операции

( INSERT, UPDATE, DELETE ).

Если

для

таблицы

предусмотрено

выполнение

нескольких AFTER -триггеров,

то

с

помощью

системной

хранимой

процедуры sp_settriggerorderможно указать, какой из них будет

выполняться первым, а

какой последним. По умолчанию в SQL Server все триггеры являются AFTER-триггерами.

INSTEAD OF триггер вызывается вместо выполнения команд. В отличие от AFTER - триггера INSTEAD OF -триггер может быть определен как для таблицы, так и для представления. Для каждой операции INSERT, UPDATE, DELETE можно определить только один INSTEAD OF -триггер. триггеры INSTEAD OF срабатывают до триггеров FOR или AFTER. И если в таблице имеются триггеры AFTER, они сработают после обработки ограничений. В случае нарушения ограничений выполняется откат действий триггеров INSTEAD OF, а триггер AFTER не срабатывает. Графически схему работы триггеров можно представить так, как показано на рисунке 1.

103

Рисунок 1. орядок выполнения триггеров

Определившись, с командами FOR и INSTEAD OF перейдем к событиям, на которые реагируют триггеры. Как уже было сказано существует три типа триггеров:

INSERT TRIGGER – запускаются при попытке вставки данных

UPDATE TRIGGER – запускаются при попытке изменения данных

DELETE TRIGGER – запускаются при попытке удаления данных

Конструкции DELETE,

INSERT, UPDATE

определяют, на

какую

команду будет

реагировать триггер. При

его создании должна

быть указана

хотя бы

одна команда.

Допускается создание триггера, реагирующего на две или на все три команды. При выполнении любой из команд (Insert, Update, Delete) сервер создает две специальные таблицы: inserted и deleted. В них содержатся списки строк, которые будут вставлены или удалены по завершении транзакции. Читателю может быть не очень понятно, о какой транзакции идет речь, и поэтому я хочу это пояснить. Дело в том, что когда производится запуск триггера, SQL Server скрытно запускает транзакцию (так называемую неявную транзакцию), если транзакция явно не

была определена пользователем, т.е.

триггер

это и есть транзакция. Поэтому

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

команд управления транзакциями. В частности,

при обнаружении нарушения ограничений

целостности

для прерывания выполнения триггера и

отмены всех изменений, которые пытался выполнить пользователь, необходимо использовать команду ROLLBACK TRANSACTION. Вернемся опять к таблицам inserted и deleted их структура идентична структуре таблиц, для которой определяется триггер. Для каждого триггера создается свой комплект таблиц inserted и deleted, поэтому никакой другой триггер не сможет получить к ним доступ. В зависимости от типа операции, вызвавшей выполнение триггера, содержимое таблиц inserted и deleted может быть разным:

104

Триггер с командой INSERT

Пример такого триггера:

CREATE TRIGGER DML_AddRecordToMarks ON Students FOR INSERT

AS

IF EXISTS (Select ‘true’ from students where group is null) BEGIN

RAISERROR (‘Группа студента должна быть указана’)

ROLLBACK TRAN END

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

Триггер с командой DELETE

Пример такого триггера:

CREATE TRIGGER DML_PrintDelete ON Students FOR DELETE

AS

PRINT(‘ роизведено удаление студента’)

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

Триггер с командой UPDATE

Пример такого триггера:

CREATE TRIGGER DML_AddRecordToMarks ON Students FOR UPDATE

AS

PRINT(‘ роизведено обновление студента’)

Этот триггер сработает при любом изменении данных из таблицы Students. При этом в таблице deleted находятся старые значения строк, которые будут удалены при успешном завершении триггера. Новые значения строк содержатся в таблице inserted. Эти строки добавятся в исходную таблицу после успешного выполнения триггера.

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

команды изменения. Одна такая

команда воздействует на множество

строк,

поэтому триггер должен обрабатывать все

эти строки. Если триггер обнаружил, что

из 100

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

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

105

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

INSERT INTO Сделка VALUES (3,1,-299,'01/08/2002')

Создаваемый триггер должен отреагировать на ее выполнение следующим образом: необходимо отменить команду, если в таблице Склад величина остатка товара оказалась меньше продаваемого количества товара с введенным кодом (в примере код товара=3 ). Во вставляемой записи количество товара указывается со знаком "+", если товар поставляется, и со знаком "-", если он продается. Представленный триггер настроен на обработку только одной добавляемой записи.

CREATE TRIGGER Insert_ Сделка ON Сделка FOR INSERT

AS

IF @@ROWCOUNT=1 BEGIN

IF NOT EXISTS(SELECT * FROM inserted

WHERE -inserted.количество<=ALL(SELECT

Склад.Остаток FROM Склад,Сделка

WHERE Склад.КодТовара= Сделка.КодТовара))

BEGIN ROLLBACK TRAN

PRINT

'Отмена поставки: товара на складе нет'

END END

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

DELETE FROM Сделка WHERE КодСделки=4

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

CREATE TRIGGER Delete_Сделка

ON Сделка FOR DELETE

AS

IF @@ROWCOUNT=1 -- удалена одна запись

BEGIN

DECLARE @y INT,@x INT

--определяется код и количество товара из --удаленной из таблицы Склад записи

SELECT @y=КодТовара, @x=Количество

FROM deleted

--в таблице Склад корректируется количество --товара

UPDATE Склад

SET Остаток=Остаток-@x WHERE КодТовара=@y

END

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

106

Приложение 1 Типы данных SQL Server (2005 версия)

Обозначение

Класс

Размер

Описание

типа

(байт)

 

 

 

 

 

 

Bit

Целочисленные

1

Хранит значения 0 или 1. Если разрешены NULL

данные

значения, то используется еще 1 бит байта.

 

 

 

 

 

 

Bigint

Целочисленные

8

От -263 до 263-1 (92 квинтиллиона)

 

данные

 

 

 

 

 

 

Int

Целочисленные

4

От -2 147 483 648 до 2 147 483 647

данные

 

 

 

 

 

 

 

Smallint

Целочисленные

2

От -32768 до 32677

данные

 

 

 

 

 

 

 

Tinyint

Целочисленные

1

От 0 до 255

данные

 

 

 

 

 

 

 

Decimal

Целочисленные

Задается

От -1038-1 до 1038-1

 

данные

отдельно

 

 

 

 

 

Numeric

Целочисленные

Задается

От -1038-1 до 1038-1

 

данные

отдельно

 

 

 

 

 

Money

Финансовые

8

От -263 до 263-1 (92 квинтиллиона)

данные

 

 

 

 

 

 

 

Smallmoney

Финансовые

4

От -214 748.3648 до 214 748.3647

данные

 

 

 

 

 

 

 

Float (real)

Приближенные

Задается

Задается в битах!

 

данные

отдельно

От -1.79Е+308 до 1.79Е+308

 

 

 

 

 

 

 

 

Datetime

Данные о дате и

8

С 1 января 1753 года по 31 декабря 9999

 

времени

Точность 3 сотых секунды

 

 

 

 

 

 

 

 

 

Smalldatetime

Данные о дате и

4

С 1 января 1900 года по 6 июня 2079 года

 

времени

Точность 1 минута

 

 

 

 

 

 

 

 

 

Cursor

Специальные

1

Указатель на курсор

числовые данные

 

 

 

 

 

 

 

 

Специальные

 

Это количество секунд прошедших с 1 января 1970

Timestamp

8

года (изменение данного столбца пользователем

двоичные данные

 

 

запрещено) точность 3 сотых секунды

 

 

 

 

 

 

 

 

Специальные

 

GUID (Globally Unique Identifier) — статистически

Uniqueidentifier

16

уникальный 128-битный идентификатор. (изменение

двоичные данные

 

 

 

данного столбца пользователем запрещено)

 

 

 

 

 

 

 

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

Char

Символьные

Задается

количество данных не хватает до заданной длины,

данные

отдельно

пустоты заполняются пробелами. Максимальная

 

 

 

 

длина 8000 символов. Кодировка любая!

 

 

 

 

 

 

 

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

 

 

 

количество данных не хватает до заданной длины,

Varchar

Символьные

Задается

пустоты не заполняются пробелами. Максимальная

данные

отдельно

длина 8000 символов, однако, для обозначения длины

 

 

 

 

можно использовать varchar (max), что позволяет

 

 

 

хранить 231 байт символов. Кодировка любая!

 

 

 

 

Text

Символьные

Задается

Устаревший тип данных, применяется для

данные

отдельно

совместимости. Не применять!

 

 

 

 

 

 

Символьные

 

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

Nchar

данные в

Задается

количество данных не хватает до заданной длины,

кодировке

отдельно

пустоты заполняются пробелами. Максимальная

 

 

Unicode

 

длина 4000 символов. Кодировка Unicode!

 

 

 

 

 

 

 

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

 

Символьные

 

количество данных не хватает до заданной длины,

Nvarchar

данные в

Задается

пустоты не заполняются пробелами. Максимальная

кодировке

отдельно

длина 4000 символов, однако для обозначения длины

 

 

Unicode

 

можно использовать nvarchar (max), что позволяет

 

 

 

хранить 231 байт символов. Кодировка любая!

 

 

 

 

 

Символьные

 

 

Ntext

данные в

Задается

Устаревший тип данных, применяется для

кодировке

отдельно

совместимости. Не применять!

 

 

Unicode

 

 

 

 

 

 

binary

Двоичные данные

Задается

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

отдельно

максимальной длиной 8000 байтов

 

 

 

 

 

 

 

Двоичные данные переменной длины с максимальной

Varbinary

Двоичные данные

Задается

длиной 8000 байтов, однако, для обозначения длины

отдельно

можно использовать Varbinary (max), что позволяет

 

 

 

хранить 231 байт данных.

 

 

 

 

Image

Двоичные данные

Задается

Устаревший тип данных, применяется для

отдельно

совместимости. Не применять!

 

 

 

 

 

 

Определяе

 

 

 

тся

Этот тип данных предназначен для работы с

table

-

динамичес

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

ки по

основном в функциях. Использовать такой тип для

 

 

 

 

особому

столбцов таблицы запрещено!

 

 

принципу

 

 

 

 

 

 

 

Определяе

 

 

 

тся

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

Sql_variant

-

динамичес

зависимости от того, к какому типу будут приведены

ки по

данные в дальнейшем. (приведение к определенному

 

 

 

 

особому

типу должно быть явным!)

 

 

принципу

 

 

 

 

 

xml

Символьные

Задается

Хранит данные с использованием специальных тегов

данные

отдельно

XML.

 

 

 

 

 

108

Приложение 2. Максимальные размеры и количества для различных объектов SQL Server

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

 

 

 

 

 

 

 

 

 

Максимальные

 

Максимальные

 

Объект компонента SQL Server

 

размеры и

 

размеры и

 

 

количества для SQL

 

количества для SQL

 

Database Engine

 

 

 

 

Server (32-разрядная

 

Server (64-

 

 

 

 

 

 

 

версия)

 

разрядная версия)

 

Размер пакета1

 

65 536 * размер

 

65 536 * размер

 

 

 

сетевого пакета

 

сетевого пакета

 

 

 

 

 

Байтов на столбец с короткой строкой

8000

8000

 

 

 

 

 

Байтов на GROUP BY, ORDER BY

8,060

8,060

 

 

 

 

 

Байтов на ключ индекса2

900

900

 

Байтов на внешний ключ

900

900

 

 

 

 

 

Байтов на первичный ключ

900

900

 

 

 

 

 

Байтов на строку8

8060

8060

 

Байтов в исходном тексте хранимой

 

Меньше размера

 

Меньше размера

 

процедуры

 

пакета или 250 МБ

 

пакета или 250 МБ

 

 

 

 

 

Байтов на столбец varchar(max),

2^31-1

2^31-1

 

varbinary(max), xml, text или image

 

 

 

 

 

 

 

 

 

Символов на

2^30-1

2^30-1

 

столбец ntext или nvarchar(max)

 

 

 

 

 

 

 

 

 

Количество кластеризованных индексов

1

1

 

в таблице

 

 

 

 

 

 

 

 

 

 

 

Столбцов на GROUP BY, ORDER BY

 

Ограничивается

 

Ограничивается

 

 

 

только числом байтов

 

только числом

 

 

 

 

 

байтов

 

 

 

 

 

Столбцов или выражений в инструкции

10

10

 

GROUP BY WITH CUBE или WITH

 

 

 

 

 

ROLLUP

 

 

 

 

 

 

 

 

 

Столбцов на ключ индекса7

16

16

 

Столбцов на внешний ключ

16

16

 

 

 

 

 

Столбцов на первичный ключ

16

16

 

 

 

 

 

Столбцов на неширокую таблицу

1024

1024

 

 

 

 

 

Столбцов на широкую таблицу

30000

30000

 

 

 

 

 

Столбцов на инструкцию SELECT

4096

4096

 

 

 

 

 

Столбцов на инструкцию INSERT

4096

4096

 

 

 

 

 

 

109

Соединений на одного клиента

Максимальное

Максимальное

 

 

значение настроенных

значение

 

 

соединений

настроенных

 

 

 

соединений

 

 

 

 

 

Размер базы данных

524 272 ТБ

524 272 ТБ

 

 

 

 

 

Баз данных на один экземпляр SQL

32767

32767

 

Server

 

 

 

 

 

 

 

Файловых групп на одну базу данных

32767

32767

 

 

 

 

 

Файлов на одну базу данных

32767

32767

 

 

 

 

 

Размер файла (данные)

16 ТБ

16 ТБ

 

 

 

 

 

Размер файла (журнал)

2 ТБ

2 ТБ

 

 

 

 

 

Ссылок на таблицы внешнего ключа для

253

253

 

таблицы4

 

 

 

Длина идентификатора (в символах)

128

128

 

 

 

 

 

Экземпляров на один компьютер

50 экземпляров на

50 экземпляров на

 

 

отдельном сервере

отдельном сервере.

 

 

для всех выпуском (у

25 экземпляров на

 

 

выпуска Workgroup не

отказоустойчивом

 

 

более 16 экземпляров)

кластере.

 

 

25 экземпляров на

 

 

 

отказоустойчивом

 

 

 

кластере.

 

 

 

 

 

 

Длина строки, содержащей инструкции

65 536 * размер

65 536 * размер

 

SQL (размер пакета)1

сетевого пакета

сетевого пакета

 

Блокировок на соединение

Максимальное число

Максимальное число

 

 

блокировок на сервер

блокировок на сервер

 

 

 

 

 

Блокировок на экземпляр SQL Server5

до 2 147 483 647

Ограничено только

 

 

 

объемом памяти

 

 

 

 

 

Уровней вложенных хранимых

32

32

 

процедур6

 

 

 

Вложенных запросов

32

32

 

 

 

 

 

Уровней вложенных триггеров

32

32

 

 

 

 

 

Количество некластеризованных

999

999

 

индексов у таблицы

 

 

 

 

 

 

 

Количество уникальных выражений в

32

32

 

предложении GROUP BY, если

 

 

 

присутствует одна из следующих

 

 

 

конструкций: CUBE, ROLLUP,

 

 

 

GROUPING SETS, WITH CUBE, WITH

 

 

 

ROLLUP

 

 

 

 

 

 

 

 

 

110