Создание запроса с уведомлениями
Уведомления о запросах построены на механизме отслеживания изменений, при помощи которого компонент Database Engine обслуживает индексированные представления. Требования и ограничения, предъявляемые к инструкциям в запросах с уведомлениями, аналогичны тем, что предъявляются к индексированным представлениям.
Значения параметров SET
При выполнении инструкции SELECT с запросом уведомления для соединения, с которого поступил запрос, должны быть установлены следующие параметры:
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
CONCAT_NULL_YIELDS_NULL ON
QUOTED_IDENTIFIER ON
NUMERIC_ROUNDABORT OFF
ARITHABORT ON
Примечание |
---|
Если уровень совместимости базы данных равен 90, при установке параметра ANSI_WARNINGS в состояние ON параметр ARITHABORT также устанавливается в состояние ON. Если уровень совместимости базы данных установлен в состояние 80 или более раннее, то параметр ARITHABORT необходимо явным образом установить в состояние ON. |
Нельзя, чтобы инструкция работала на уровнях изоляции READ_UNCOMMITTED или SNAPSHOT.
Если эти параметры или уровень изоляции соответствующим образом не установлены, уведомление создается немедленно после выполнения инструкции SELECT. Если уведомление активно, то для соединения, от которого поступила команда, вызвавшая срабатывание уведомления, должна быть также выполнена установка указанных параметров. В противном случае команда завершится ошибкой языка Transact-SQL.
Если инструкция содержится в хранимой процедуре, то при создании этой хранимой процедуры должны быть указаны параметры ANSI_NULLS и QUOTED_IDENTIFIER. Дополнительные сведения см. в разделах SET ANSI_NULLS (Transact-SQL) и SET QUOTED_IDENTIFIER (Transact-SQL).
Инструкции для уведомлений
В общем случае в качестве запроса с уведомлением может быть указан любой запрос, применимый для создания индексированного представления. Уведомления могут быть настроены для следующих инструкций:
SELECT
Требования и ограничения, предъявляемые к инструкции SELECT, см. в подразделе «Поддерживаемые инструкции SELECT» ниже. Дополнительные сведения об инструкции SELECT см. в разделе SELECT (Transact-SQL).
EXECUTE
В этом случае SQL Server регистрирует уведомление на выполняемую команду, а не на саму инструкцию EXECUTE. Команда должна соответствовать требованиям, предъявляемым к инструкции SELECT. Дополнительные сведения об инструкции EXECUTE см. в разделе EXECUTE (Transact-SQL).
Если регистрируемая команда состоит из нескольких инструкций, компонент Database Engine создает уведомления для каждой из них.
Поддерживаемые инструкции SELECT
Уведомления о запросах поддерживаются для инструкций SELECT, удовлетворяющих следующим требованиям.
Отображаемые столбцы в инструкции SELECT должны быть перечислены явно, а имена таблиц должны указываться полными двухкомпонентными именами. Обратите внимание на то, что все таблицы, на которые ссылается инструкция, должны находиться в одной и той же базе данных.
В инструкции для указания столбцов нельзя применять звездочку (*) и синтаксис вида имя_таблицы.*.
В инструкции не могут содержаться безымянные столбцы и повторяющиеся имена столбцов.
Инструкция должна ссылаться на базовую таблицу.
Инструкция не должна ссылаться на таблицы с вычисляемыми столбцами.
Отображаемые столбцы в инструкции SELECT не могут содержать статистические выражения, кроме случаев употребления выражения GROUP BY. Если указано выражение GROUP BY, список выборки может содержать агрегатную функцию COUNT_BIG() или SUM(). Однако функция SUM() не может быть указана для столбца, допускающего значение NULL. Инструкция не может содержать предложений HAVING, CUBE и ROLLUP.
Отображаемый столбец в инструкции SELECT, используемый как простое выражение, не должен встречаться в списке более одного раза.
В инструкцию нельзя включать операторы PIVOT и UNPIVOT.
В инструкцию нельзя включать операторы UNION, INTERSECT и EXCEPT.
Инструкция не должна ссылаться на представления.
Инструкция не должна содержать следующие операторы и предложения: DISTINCT, COMPUTE, COMPUTE BY и INTO.
Инструкция не должна ссылаться на глобальные серверные переменные (@@имя_переменной).
Инструкция не должна ссылаться на производные таблицы, временные таблицы и табличные переменные.
Инструкция не должна ссылаться на таблицы или представления других баз данных или серверов.
Инструкция не должна содержать вложенных запросов, внешних соединений и самосоединений.
Инструкция не должна ссылаться на типы больших объектов: text, ntext и image.
Инструкция не должна содержать полнотекстовые предикаты CONTAINS и FREETEXT.
Инструкция не должна вызывать функции наборов строк, в том числе OPENROWSET и OPENQUERY.
В инструкции не должны использоваться следующие агрегатные функции: AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR и VARP.
Инструкция не должна вызывать какие-либо недетерминированные функции, в том числе ранжирующие и аналитические.
Инструкция не должна вызывать пользовательские статистические выражения.
Инструкция не должна ссылаться на системные таблицы и представления, включая представления каталогов и динамические административные представления.
В инструкцию нельзя включать предложение FOR BROWSE.
Инструкция не должна ссылаться на очередь.
В инструкции не могут содержаться условные инструкции, которые не изменяются и не возвращают результаты (например WHERE 1=0).
Инструкция не может указывать подсказку блокировки READPAST.
Инструкция не должна ссылаться на какие-либо операторы QUEUE компонента Service Broker.
Инструкция не должна ссылаться на синонимы.
В инструкции не должно быть сравнений или выражений на основе типов данных «double/real».
В инструкции не должно использоваться выражение TOP.
Пакеты и хранимые процедуры
Если запрос на подписку сделан для пакета или хранимой процедуры, для каждой инструкции, выполняемой в пакете или хранимой процедуре, будет сделан отдельный запрос на подписку.
Инструкция EXECUTE не регистрирует уведомление, но направляет требование об уведомлении выполняемой команде. Если это пакет, к выполняемым инструкциям будет применен контекст и правила, описанные выше.
Дублирующиеся подписки
Применение дубликата активной подписки вызовет обновление существующей подписки через указанный интервал времени ожидания. Дубликат подписки должен удовлетворять следующим условиям.
Запрос должен передаваться пользователем, который создал существующую подписку в контексте той же базы данных.
Должны использоваться тот же шаблон, значения параметров, идентификатор уведомления и расположение доставки.
Это значит, что, если уведомление затребовано для одинаковых запросов, будет отправлено только одно уведомление. Данные условия применяются к запросам, дублированным в пакетах, или к запросам, которые вызываются несколько раз в хранимой процедуре.