2008-11-27 9 views
12

Como no implementamos los usuarios de nuestras aplicaciones como usuarios en el servidor SQL, cuando el servidor se conecta a una base de datos, cada aplicación siempre usa las mismas credenciales para adjuntar a cada base de datos.Servidor SQL: modificando la propiedad "Nombre de la aplicación" para propósitos de auditoría

Esto presenta un problema de auditación. Mediante el uso de desencadenantes, queremos almacenar cada actualización, insertar y eliminar, y atribuir cada una a un usuario en particular. Una posible solución es agregar una columna "actualizado por usuario" a cada tabla y actualizar esto cada vez. Esto significa una nueva columna en cada tabla y un nuevo parámetro en cada procedimiento almacenado. También significa que solo puedes hacer eliminaciones suaves.

En lugar de esto propongo usar la propiedad Nombre de la aplicación de la cadena de conexión y leer esto con la propiedad Nombre_de_aplicación() dentro del desencadenador. Probé esto con una aplicación simple y parece funcionar (el formato podría ser así: App = MyApp | User = 100).

La pregunta para ustedes es, ¿es esta una mala idea y tienen una mejor?

+0

¿Cómo resolvió esto? ¿Pudo leer "App = MyApp | User = 100" desde el disparador usando 'CONTEXT_INFO'? Necesito modificar los desencadenantes utilizados por * ApexSQL Audit 2008 * y almacenar el "usuario" pasado a través de 'ApplicationName'. – AMissico

Respuesta

10

Utilizo SET CONTEXT_INFO para esto. Es justo lo que necesitas.

+0

Aha, parece el boleto. El varbinary es un poco molesto, pero no debería ser un gran dolor de cabeza. Aclamaciones. –

+1

¡Gracias!Lo bueno es que puede hacer que funcione incluso con el acceso directo simultáneo a la base de datos, como desde MS Access, y utilizando el nombre de usuario de la conexión original, usando algo como esto: COALESCE (CONVERTIR (VARCHAR (128), CONTEXT_INFO()), CURRENT_USER) – realMarkusSchmidt

+0

Tiene un ejemplo? – AMissico

1

Utilizamos la propiedad Nombre de aplicación para controlar los desencadenantes de auditoría y no hemos visto ningún problema al usarla, y no hemos notado ningún problema de velocidad (aunque en nuestro caso, específicamente no estamos auditando para ciertas aplicaciones, por lo que es difícil para medir cuánto tiempo no toma algo :))

+0

Eso es bueno para escuchar. Por lo que suena, estás usando el mismo nombre de aplicación cada vez. Estoy proponiendo modificar el nombre de la aplicación para cada conexión para identificar al usuario actual. ¿Puedes ver algún problema con esto (no agrupamos las conexiones)? –

+0

Utilizamos dos nombres de aplicaciones diferentes, uno para cuando queremos una auditoría y otro para cuando no lo hacemos (porque lo que sea que esté usando la conexión es manejar la auditoría de forma manual). –

2

Sin duda parece una solución factible, aunque necesitará inyectar el nombre de usuario en la cadena de conexión cada vez que se cargue la aplicación. Tenga en cuenta que esta solución probablemente no funcione con una aplicación web, ya que su cadena de conexión será diferente cada vez, lo que podría ocasionar enormes problemas de agrupación de conexiones.

Otra opción es recuperar el nombre de host/la dirección IP (SELECT host_name()) y almacenar eso en su lugar.

No necesitaría necesariamente un nuevo parámetro en cada procedimiento almacenado, ya que puede modificar cada procedimiento almacenado (o el desencadenante) para insertar automáticamente el nombre de aplicación/nombre de host.

Una posible desventaja es que cualquier modificación realizada a través de Management Studio no tendrá el nombre de aplicación personalizado, y se le dejará como usuario de "Microsoft Management Studio".

+0

Aunque solíamos hacer esto, ya no usamos la agrupación de conexiones, por lo que cada conexión realizada es individual. El nombre de host/dirección IP no funcionaría porque esto vendría del servidor de aplicaciones, no del cliente. –

+0

Si tan solo hubiera encontrado esta respuesta hace unos años ... Usamos el nombre de la aplicación exactamente para este propósito, exactamente por este motivo, y tenemos problemas de agrupación de conexiones exactamente como se describe ... Ahora estoy tratando de encontrar cualquier forma de configurar el "Nombre de la aplicación" desde una conexión abierta, de modo que podamos mantener la cadena de conexión constante y acabar con los inconvenientes del grupo. – Tao

Cuestiones relacionadas