Definir acciones de condición

Actualizado: 17 de julio de 2006

Una acción es un grupo de instrucciones Transact-SQL que Notification Services ejecuta cada vez que activa una regla de suscripción. Cada regla de suscripción puede contener una acción, ya sea una acción básica, que es una consulta predefinida, o una acción de condición, que permite a los suscriptores definir el equivalente a una cláusula WHERE para la consulta de generación de notificación. En este tema se describen las acciones de condición y cómo escribirlas.

ms172509.note(es-es,SQL.90).gifImportante:
Utilice acciones de condición sólo si necesita permitir a los suscriptores que creen sus propias condiciones complejas para generar notificaciones. De lo contrario, utilice acciones predefinidas que permitan a los usuarios escribir valores para una consulta con parámetros, lo cual es más eficaz. Para obtener más información, vea Definir acciones.

Acciones de condición

Una acción de condición permite reglas flexibles creadas por los suscriptores. Mientras una acción predefinida sólo permite a los suscriptores especificar valores de parámetro para consultas definidas por el programador, una acción de condición permite a un suscriptor crear el equivalente a una cláusula WHERE para la consulta, mediante operadores booleanos (AND, OR y NOT) para combinar condiciones individuales.

Por ejemplo, una aplicación meteorológica podría tener una clase de evento que contenga dos campos: City y Forecast. El programador puede definir una consulta básica para crear notificaciones, como por ejemplo:

INSERT INTO dbo.WeatherNotifications(SubscriberId, DeviceName, 
    SubscriberLocale, City, Forecast) 
SELECT [Subscription.SubscriberId], [Subscription.DeviceName], 
    [Subscription.SubscriberLocale], [Input.City], [Input.Forecast])
FROM dbo.FlightEventRule

Observe que así se seleccionan datos de una vista denominada según la regla (en este caso, FlightEventRule). Los campos de dicha vista se denominan Subscription.nombreDeCampoDeSuscripción e Input.nombreDeCampoDeEvento, lo que requiere que los nombres de campo se especifiquen entre corchetes.

A través de una interfaz de administración de suscripciones, un suscriptor puede definir condiciones que sean equivalentes a una cláusula WHERE. Por ejemplo, un usuario puede especificar dos condiciones: City es "Seattle" y Forecast contiene "snow" y, a continuación, combinar estas condiciones con un operador AND. Esto es equivalente a la cláusula WHERE siguiente:

WHERE City = 'Seattle' AND Forecast LIKE '%snow%'

Cuando Notification Services ejecuta la regla de suscripción, procesa conjuntamente todas las condiciones similares, lo que mejora el rendimiento. A continuación, Notification Services rellena la vista de la regla con pares de suscripciones y entradas coincidentes.

Consideraciones de rendimiento

Aunque Notification Services procesa conjuntamente todas las condiciones similares, se produce una sobrecarga cuando se usan acciones de condición. Notification Services debe obtener un conjunto de todas las condiciones, organizar las condiciones para una evaluación eficaz, evaluarlas y, a continuación, generar las notificaciones resultantes para todas las suscripciones. A causa de esta sobrecarga, generalmente se tarda más en evaluar reglas que utilizan acciones de condición que en evaluar acciones predefinidas.

Seguridad

Todas las acciones de condición se ejecutan en el contexto de un usuario de base de datos que se especifica para la acción de condición. Utilizar un usuario con pocos privilegios minimiza la amenaza de seguridad en el caso de que alguien comprometa su interfaz de administración de suscripciones e inserte condiciones que intenten tener acceso a otras tablas o realizar otras acciones.

El usuario de base de datos debería tener permisos restringidos que le permitan seleccionar sólo datos de orígenes de eventos y ejecutar sólo funciones definidas por el usuario utilizadas por las condiciones.

Debe existir la cuenta de inicio de sesión de SQL Server asociada a este usuario cuando Notification Services cree objetos de aplicación en la base de datos de aplicación.

Transacciones

Todas las instrucciones de una acción de condición forman parte de la misma transacción, por lo que todas finalizarán correctamente o todas se revertirán. Si se produce un error en la transacción, Notification Services escribirá un error en el registro de aplicación de Windows.

Definir una acción de condición

Si está definiendo una aplicación a través de XML, defina acciones de condición en el archivo de definición de aplicación (ADF). Si está definiendo una aplicación mediante programación, utilice los Objetos de administración de Notification Services (NMO) para definir acciones de condición.

Para definir una acción de condición

Inicio de sesión de SQL Server

Dado que Notification Services ejecuta todas las acciones de condición en el contexto de un usuario de base de datos especificado, debe especificar la cuenta de inicio de sesión que está asociada al usuario. Debe existir el inicio de sesión antes de que Notification Services cree la aplicación. Si no existe el inicio de sesión, Notification Services generará un error al intentar crear la aplicación y revertirá la creación de la instancia o la actualización de la instancia.

Asegúrese de que el inicio de sesión tiene permisos restringidos en el servidor. Lo mejor es que el inicio de sesión no tenga ningún permiso para todo el servidor y que no pertenezca a ninguna función del servidor.

Para definir el inicio de sesión de SQL Server

Usuario de la base de datos

El usuario de la base de datos es la cuenta en la que se ejecutan todas las acciones de condición. Notification Services concede algunos de los permisos necesarios para ejecutar acciones de condición a este usuario de la base de datos. Si no existe el usuario de la base de datos cuando Notification Services crea la aplicación, Notification Services también creará el usuario de la base de datos.

Notification Services concede los permisos necesarios en los objetos de Notification Services, pero no concede permisos en las tablas o vistas de entrada, ni permisos en cualquier función definida por el usuario utilizada por las acciones de condición. Deberá conceder estos permisos al implementar la aplicación. Los comandos Transact-SQL para conceder estos permisos tienen la forma siguiente:

-- grant permissions on the view for an input event class
GRANT SELECT ON ApplicationSchema.EventClassName TO SqlUserAccount
-- grant permissions on an input event chronicle table
GRANT SELECT ON ChronicleSchema.ChronicleName TO SqlUserAccount
-- grant execute permissions on a user-defined function 
-- used in Subscription.Conditions
GRANT EXEC ON UDFSchema.MyUserDefinedFunction TO SqlUserAccount
Para definir el usuario de la base de datos

Nombre de entrada

Cuando utilice una acción de condición, debe especificar qué vista o tabla contiene los datos de eventos.

  • Si la acción de condición está en una regla de evento, la entrada normalmente es la vista de eventos, que tiene el mismo nombre que la clase de eventos.
    Advertencia   No use la tabla de eventos denominada NSnombreDeClaseDeEventoEvents como entrada. Esta tabla contiene todos los eventos que no se han eliminado del sistema y generará notificaciones duplicadas.
  • Si la acción de condición es para una regla programada, la entrada normalmente es una crónica de eventos.
    Advertencia   Para las reglas programadas, no use la vista de eventos denominada nombreDeClaseDeEvento como entrada. Esta vista contiene sólo el lote actual de eventos y a menudo estará vacía o incompleta para las reglas programadas.
Para definir el nombre de entrada

Esquema de entrada

El esquema de entrada es el nombre del esquema de base de datos para la entrada.

  • Si la entrada es la vista de eventos, el esquema es el esquema de aplicación. El esquema de aplicación se puede definir al definir la base de datos de aplicación, o puede ser el valor predeterminado de dbo. Para obtener más información, vea Definir la base de datos de aplicación.
  • Si la entrada es una crónica de eventos, el esquema se define en la instrucción CREATE TABLE que crea la crónica de eventos. Normalmente es el mismo que el esquema de aplicación. Para obtener más información, vea Definir crónicas para una clase de evento.
Para definir el esquema de entrada

Expresión de Transact-SQL

Cada acción de crónica especifica la consulta principal para generar notificaciones. La consulta especifica la consulta que selecciona campos de suscripción y entrada, y los agrega a la tabla de notificaciones.

La consulta debe seleccionar campos de suscripción y entrada de una vista que combina datos de suscripción y de eventos. Los campos de suscripción de la vista tienen nombres con la forma [Subscription.nombreDeCampoDeSuscripción]. Los campos de entrada (evento) tienen nombres con la forma [Input.nombreDeCampoDeEvento].

Los suscriptores crean el equivalente a la cláusula WHERE para la consulta a través de una interfaz de administración de suscripciones. Notification Services evalúa las acciones de condición para todas las suscripciones relevantes y, a continuación, genera notificaciones.

Plantilla

La plantilla de Transact-SQL siguiente muestra cómo escribir una expresión de Transact-SQL para una acción de condición.

INSERT INTO schema.NotificationClassName(SubscriberId, 
    DeviceName, SubscriberLocale, NotificationFields) 
SELECT [Subscription.SubscriberId], DeviceName, SubscriberLocale, 
    [Input.EventFieldName], ...
FROM schema.RuleName

En la instrucción SELECT, puede seleccionar los valores DeviceName y SubscriberLocale de un origen de datos, como la vista denominada según la regla, o proporcionar valores literales, como "Archivo" y "en-US".

La consulta puede contener otras instrucciones y no es necesaria para generar notificaciones. La consulta puede hacer todo el trabajo necesario, como mantener una crónica. Sin embargo, al menos una regla de suscripción debería generar notificaciones. De lo contrario, la aplicación no generará ni distribuirá notificaciones a los suscriptores.

Cláusula INSERT

Tal como se muestra en la plantilla, en la instrucción INSERT, debe especificar los campos siguientes, en este orden:

  • SubscriberId
  • DeviceName
  • SubscriberLocale

Todos los campos no calculados se definen en el esquema de notificación. Si utiliza campos calculados, no agregue valores a estos campos. Esos valores se calculan cuando inserta los datos de notificación.

Tenga en cuenta que los valores SubscriberId y DeviceName deben coincidir con un registro de la tabla SubscriberDevices.

Agregue a la tabla de notificaciones sólo dentro de una regla de suscripción. Cuando se procesan reglas de suscripción, Notification Services prepara cada activación de regla, activa las reglas y, a continuación, limpia después de la activación de las reglas. Si intenta insertar notificaciones fuera de la activación de reglas de suscripción, la preparación y la limpieza no se producirán, lo que causará errores.

Usar procedimientos almacenados

En vez de incrustar las instrucciones Transact-SQL en la acción de condición, puede llamar a un procedimiento almacenado. Debe crear el procedimiento almacenado en la base de datos de aplicación. Puede definir el procedimiento almacenado en una secuencia de comandos de implementación. Debería crear el procedimiento almacenado después de que Notification Services cree la instancia o agregue la aplicación, pero antes de habilitar la instancia o la aplicación.

Para utilizar un procedimiento almacenado, reemplace el texto de consulta por una llamada al procedimiento almacenado. En el ejemplo siguiente se muestra cómo llamar a un procedimiento almacenado:

EXECUTE dbo.WeatherConditionActionSP;
Para definir la expresión de Transact-SQL

Escribir interfaces de administración de suscripciones

Al escribir interfaces de administración de suscripciones, debe considerar los tipos de suscripciones que admite la aplicación. Para las suscripciones basadas en condiciones, la interfaz de administración de suscripciones debe permitir que el suscriptor especifique las condiciones, como seleccionar un campo de un cuadro desplegable, especificar un operador y proporcionar un valor.

Para obtener un ejemplo de un código que muestre cómo agregar una suscripción basada en condiciones, vea Agregar una suscripción.

Vea también

Referencia

Microsoft.SqlServer.NotificationServices.Rules

Conceptos

Definir acciones
Definir reglas de evento
Definir reglas programadas

Otros recursos

INSERT (Transact-SQL)
SELECT (Transact-SQL)
Definir clases de suscripción
Desarrollar interfaces de administración de suscripciones

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

17 de julio de 2006

Contenido modificado:
  • Se agregó la sección sobre interfaces de administración de suscripciones.