Trabajar con notificaciones de consulta

Se aplica a:SQL ServerAzure SQL Managed Instance

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de SQL Server motor de base de datos (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

Las notificaciones de consulta se introdujeron en SQL Server 2005 (9.x) y SQL Server Native Client. Basado en la infraestructura de Service Broker introducida en SQL Server 2005 (9.x), las notificaciones de consulta permiten que las aplicaciones se notifiquen cuando los datos han cambiado. Esta característica resulta especialmente útil para las aplicaciones que proporcionan una caché de información de una base de datos, como una aplicación web, y necesitan recibir notificaciones si se modifican los datos de origen.

Las notificaciones de consulta permiten al usuario solicitar notificaciones dentro de un período de tiempo de espera especificado si se modifican los datos subyacentes de una consulta. La solicitud de notificación especifica las opciones de notificación, entre las que se incluyen el nombre de servicio, el texto del mensaje y el valor de tiempo de espera para el servidor. Las notificaciones se entregan a través de una cola de Service Broker que las aplicaciones pueden sondear de cara a las notificaciones disponibles.

La sintaxis de la cadena de opciones de notificación de consulta es la siguiente:

service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]

Por ejemplo:

service=mySSBService;local database=mydb

Las suscripciones de notificación duran más que el proceso que las inicia, de modo que una aplicación puede crear una suscripción de notificación y, a continuación, terminar. La suscripción seguirá siendo válida y la notificación se producirá si los datos cambian dentro del período de tiempo de espera especificado al crear la suscripción. Una notificación se identifica mediante la consulta ejecutada, las opciones de notificación y el texto del mensaje, y puede cancelarse estableciendo su valor de tiempo de espera en cero.

Las notificaciones se envían una sola vez. Para obtener notificaciones continuas de cambios de datos, debe crearse una nueva suscripción ejecutando de nuevo la consulta después de procesar cada notificación.

SQL Server Native Client las aplicaciones suelen recibir notificaciones mediante el comando RECEIVE de Transact-SQL para leer las notificaciones de la cola asociada al servicio especificado en las opciones de notificación.

Nota:

Los nombres de tabla deben calificarse en las consultas para las que se requiere notificación como, por ejemplo, dbo.myTable. Las tablas deben calificarse con nombres de dos partes. La suscripción no será válida si se usan nombres de tres o cuatro partes.

La infraestructura de notificación se crea a partir una característica de colas introducida en SQL Server 2005 (9.x). Normalmente, las notificaciones generadas en el servidor se envían a través de estas colas para procesarse más adelante.

Para poder usar notificaciones de consulta, debe haber una cola y un servicio en el servidor. Se pueden crear con Transact-SQL de forma similar a la siguiente:

CREATE QUEUE myQueue  
CREATE SERVICE myService ON QUEUE myQueue   
  
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])  

Nota:

El servicio debe usar el contrato predefinido http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification, tal y como se indicó anteriormente.

Proveedor OLE DB de SQL Server Native Client

El proveedor OLE DB SQL Server Native Client admite la notificación de consumidor en la modificación del conjunto de filas. El consumidor recibe notificaciones en cada fase de modificación del conjunto de filas y ante cualquiera intento de modificación.

Nota:

Pasar una consulta de notificaciones al servidor con ICommand::Execute es la única manera válida de suscribirse a las notificaciones de consulta con el proveedor OLE DB de SQL Server Native Client.

Conjunto de propiedades DBPROPSET_SQLSERVERROWSET

Para admitir notificaciones de consulta a través de OLE DB, SQL Server Native Client agrega las siguientes propiedades nuevas al conjunto de propiedades DBPROPSET_SQLSERVERROWSET.

Nombre Tipo Descripción
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 Número de segundos que la notificación de consulta va a permanecer activa.

El valor predeterminado es 432000 segundos (5 días). El valor mínimo es 1 segundo y el valor máximo es 2^31-1 segundos.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR Texto del mensaje de la notificación. Lo define el usuario y no tiene ningún formato predefinido.

De forma predeterminada, la cadena está vacía. Puede especificarse un mensaje usando de 1 a 2000 caracteres.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR Opciones de notificación de consulta. Se especifican en una cadena con la sintaxis nombre=valor. El usuario es responsable de la creación del servicio y de la lectura de las notificaciones fuera de la cola.

El valor predeterminado es una cadena vacía.

La suscripción de notificación se confirma siempre, independientemente de que la instrucción se haya ejecutado en una transacción de usuario o en una confirmación automática o de que la transacción en la que se haya ejecutado la instrucción se haya confirmado o revertido. La notificación del servidor se activa ante cualquiera de las siguientes condiciones de notificación no válida: cambio de esquema o datos subyacentes o cuando se alcanza el período de tiempo de espera, lo que ocurra antes. Los registros de notificación se eliminan en cuanto se activan. Por lo tanto, al recibir las notificaciones, la aplicación debe suscribirse de nuevo en caso de que deseen obtenerse actualizaciones posteriores.

Otra conexión o subproceso puede comprobar las notificaciones en la cola de destino. Por ejemplo:

WAITFOR (RECEIVE * FROM MyQueue);   // Where MyQueue is the queue name.   

Tenga en cuenta que SELECT * no elimina la entrada de la cola; sin embargo, RECEIVE * FROM sí que la elimina. Esto detiene un subproceso del servidor si la cola está vacía. Si hay entradas en la cola en el momento de la llamada, se devuelven inmediatamente; de lo contrario, la llamada espera a que se realice una entrada en la cola.

RECEIVE * FROM MyQueue  

Si la cola está vacía, esta instrucción devuelve inmediatamente un conjunto de resultados vacío; de lo contrario, devuelve todas las notificaciones en cola.

Si los valores SSPROP_QP_NOTIFICATION_MSGTEXT y SSPROP_QP_NOTIFICATION_OPTIONS son distintos de NULL y no están vacíos, el encabezado TDS de notificación de consulta que contiene las tres propiedades definidas anteriormente se envía al servidor cada vez que se ejecuta el comando. Si alguno de estos valores es NULL (o está vacío), el encabezado no se envía y se produce un error DB_E_ERRORSOCCURRED (o DB_S_ERRORSOCCURRED si ambas propiedades están marcadas como opcionales) y el valor de estado se establece en DBPROPSTATUS_BADVALUE. La validación se produce durante la ejecución y preparación. Del mismo modo, DB_S_ERRORSOCCURED se genera cuando las propiedades de notificación de consulta se establecen para las conexiones a SQL Server versiones anteriores a SQL Server 2005 (9.x). En este caso, el valor de estado es DBPROPSTATUS_NOTSUPPORTED.

Iniciar una suscripción no garantiza que los mensajes posteriores se entregarán correctamente. Además, no se realiza ninguna comprobación de validez del nombre de servicio especificado.

Nota:

La preparación de instrucciones no hará nunca que se inicie una suscripción; esta acción solo se consigue mediante la ejecución de instrucciones, y las notificaciones de consulta no se verán afectadas por el uso de los servicios principales de OLE DB.

Para obtener más información sobre el conjunto de propiedades de DBPROPSET_SQLSERVERROWSET, vea Propiedades y comportamientos del conjunto de filas.

Controlador ODBC de SQL Server Native Client

El controlador ODBC de SQL Server Native Client admite notificaciones de consulta mediante la adición de tres atributos nuevos a las funciones SQLGetStmtAttr y SQLSetStmtAttr:

  • SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT

  • SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS

  • SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT

Si los valores de SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT y SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS son distintos de NULL, el encabezado TDS de notificación de consulta que contiene los tres atributos definidos anteriormente se enviará al servidor cada vez que se ejecute el comando. Si alguno de estos valores es NULL, el encabezado no se envía y se devuelve SQL_SUCCESS_WITH_INFO. La validación se produce en la función SQLPrepare, SqlExecDirect y SqlExecute, lo que produce un error si los atributos no son válidos. Del mismo modo, cuando estos atributos de notificación de consulta se establecen para SQL Server versiones anteriores a SQL Server 2005 (9.x), se produce un error en la ejecución con SQL_SUCCESS_WITH_INFO.

Nota:

La preparación de instrucciones no hará que se inicie nunca la suscripción; la ejecución de la instrucción sí que puede iniciar la suscripción.

Restricciones y casos especiales

Las notificaciones no admiten los siguientes tipos de datos:

  • text

  • ntext

  • image

Si se realiza una solicitud de notificación para una consulta que devuelve cualquiera de estos tipos, la notificación se activa inmediatamente, especificando que no fue posible la suscripción de notificación.

Cuando se realiza una solicitud de suscripción para un lote o procedimiento almacenado, se realiza una solicitud de suscripción independiente para cada instrucción del lote o procedimiento almacenado. Las instrucciones EXECUTE no registrarán ninguna notificación, pero enviarán la solicitud de notificación al comando ejecutado. Si se trata de un lote, el contexto se aplicará a las instrucciones ejecutadas y se aplicarán las mismas reglas descritas anteriormente.

El envío de una consulta para la notificación enviada por el mismo usuario en el mismo contexto de base de datos y tiene la misma plantilla, los mismos valores de parámetro, el mismo identificador de notificación y la misma ubicación de entrega de una suscripción activa existente, renovará la suscripción existente y restablecerá el nuevo tiempo de espera especificado. Esto significa que si se solicita notificación para consultas idénticas, solo se enviará una notificación. Esto se aplicaría a una consulta duplicada de un lote o si se llamó varias veces a una consulta de un procedimiento almacenado.

Consulte también

Características de SQL Server Native Client