Pregunta

Estoy tratando de investigar cuando y por qué ciertas filas están siendo eliminados en una base de datos SQL 2005. He comenzado la construcción de un disparador para iniciar la sesión alguna información cuando se elimina una fila.

Mi disparador se activa cuando la fila (s) se elimina de una determinada mesa. Lo tengo configurado para registrar una marca de tiempo en otra tabla de registro cuando se produce la eliminación. También me gustaría que entrar los datos que se ha eliminado, pero preferiría no molestar con la escritura de código para cada campo y el valor.

Sé que cuando se eliminan los datos se puede observar (temporalmente) en la tabla de "Eliminado" en SQL Server. Así que justo después de una eliminación, podría "SELECT * FROM Eliminado" y ver los datos. Me gustaría tomar el contenido de esta tabla, y convertirla en una burbuja de texto grande que sólo puede guardar en un campo de texto en mi mesa de registro.

Así que ... en términos más simples, hay una manera que puedo tomar un conjunto de registros de una o más filas y convertirla en una sola variable de cadena? todo dentro de los comandos SQL en mi gatillo? Los puntos de bonificación si pueden incluir nombres de columna.

Gracias

¿Fue útil?

Solución

Me quedaría lejos de cualquier cosa que pudiera correr demasiado tiempo cuando se trabaja en un disparador. Eso incluye alguna consulta sólo para determinar un diseño de tabla estática (ya que no desea escribir el código usted mismo) para que pueda construir una cadena.

que hago este tipo de cosas todo el tiempo, pero sobre todo con los parámetros de procedimiento almacenado. Tengo la mayor parte de esto en una plantilla que uso.

crear esta función, se mostrará la columna muy bien entre comillas o mostrar NULL:

CREATE FUNCTION [dbo].[QuoteNull]
(
     @InputStr      varchar(8000)  --value to pad
)
RETURNS
varchar(8000)
AS

/*
TEST WITH:
----------
PRINT '     dbo.QuoteNull(null)             ->'+dbo.QuoteNull(null)+'<-'
PRINT '     dbo.QuoteNull(''apple'')          ->'+dbo.QuoteNull('apple')+'<-'
PRINT '     dbo.QuoteNull(123)              ->'+dbo.QuoteNull(123)+'<-'
PRINT '     dbo.QuoteNull(GETDATE())        ->'+dbo.QuoteNull(GETDATE())+'<-'
PRINT '     dbo.QuoteNull(GETDATE())        ->'+dbo.QuoteNull(CONVERT(varchar(23),GETDATE(),121))+'<-'
*/

BEGIN
    RETURN COALESCE(''''+@InputStr+'''','null')
END

GO

pega esto en su código:

INSERT INTO YourLogTable
        (xxx,yyy,zzz,ColumnTextValue)
    SELECT
        xxx,yyy,zzz,'values:'
            +'  '+RTRIM('ColumnNameInt               ')+'='+dbo.QuoteNull(                    ColumnNameInt               )
            +', '+RTRIM('ColumnNameVarchar           ')+'='+dbo.QuoteNull(                    ColumnNameVarchar           )
            +', '+RTRIM('ColumnNameChar              ')+'='+dbo.QuoteNull(                    ColumnNameChar              )
            +', '+RTRIM('ColumnNameDate              ')+'='+dbo.QuoteNull(CONVERT(varchar(23),ColumnNameDate         ,121))
        FROM DELETED

asegurarse de que tiene una fila para cada columna de la tabla (si tiene más apenas suprima los adicionales posteriores), si quieres ver cualquier fecha en detalle, utilizar el convertido como se muestra arriba.

ejecutar esta consulta:

select sc.name 
    FROM syscolumns sc INNER JOIN sysobjects so ON sc.id = so.id 
    where UPPER(so.name)=UPPER('YourTableName') order by sc.colorder desc 

tomar la salida en SQL Server Management Studio (dentro del modo de salida de texto), y hacer ALT-left_click arrastrar un cuadrado sobre los nombres de las columnas, y copiar esta columna de selección basado.

Vuelve a tu código y ALT-clic y arrastrar un cuadrado sobre la completa "ColumnName ..." Los valores en la columna izquierda de la instrucción de inserción y pegar. Si ha realizado una selección de columnas, que reemplazará a la columna y dejar solamente el código sin cambios a la izquierda y la derecha. Haga lo mismo para el "ColumnName ..." valores de la derecha de la inserción y ahora tiene un INSERT que construirá los datos que desea pero no perder demasiado tiempo en el gatillo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top