Log de borrado de registros | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

Log de borrado de registros

Hola a [email protected]: Quisiera saber como puedo, guardar informacion (Clave del regto borrado, fecha e ip o nombre de maquina )de quien borra registros de una tabla en un MSSQL. La informacion me da igual que quede en un log o en otra tabla. (preferible en tabla) Un saludo Y muchas gracias por adelantado Nacho
Lo más sencillo es crear un trigger de DELETE en la tabla y crear otra tabla que guarde los datos que te interesa saber. Para obtener los datos utiliza las siguientes funciones: sUser_sName() –> Nombre de Usuarios
Host_Name() –> Nombre de Maquina que solicita el query
Getdate() –> fecha y hora actual Un ejemplo:
CREATE TABLE [LogDeMiTabla]
(
[nLog] [int] IDENTITY (1, 1) NOT NULL ,
[nKey] [int] NOT NULL ,
[dGetDate] [datetime] NOT NULL ,
[cHostName] [nvarchar] (50) NOT NULL ,
[cUserName] [nvarchar] (50) NOT NULL ,
CONSTRAINT [PK_LogDeMiTabla] PRIMARY KEY CLUSTERED
([nLog])
) GO CREATE TABLE [MiTabla]
(
[nKey] [int] NOT NULL ,
[cDescripcion] [nvarchar] (100) NOT NULL ,
CONSTRAINT [PK_MiTabla] PRIMARY KEY CLUSTERED
([nKey])
)
GO
CREATE TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]
FOR DELETE
AS Insert [LogDeMiTabla]
(
[nKey],
[dGetDate],
[cHostName],
[cUserName]
)
Select[nKey],
getdate(),
Host_Name(),
sUser_sName()
From Deleted Go
–Agregamos unos valores a MiTabla Set nocount on Insert [MiTabla] Values (1,’Valor I’)
Insert [MiTabla] Values (2,’Valor II’)
Insert [MiTabla] Values (3,’Valor III’)
Insert [MiTabla] Values (4,’Valor IV’)
Insert [MiTabla] Values (5,’Valor V’) –Borramos el registro con nKey =3 Delete [MiTabla] Where nKey = 3 –Verificamos que queda en MiTabla y en el Log Select * from [MiTabla]
Select * from [LogDeMiTabla] Saludos
Funciona perfecto muchas gracias. Solo una pregunta mas, en que parte del administrador corporativo se encuentran los Trigger, para poder modificarlos, borrarlos etc Un saludo
En propiedades de una tabla, cualquiera sea ella, dentro de la base de datos.
Luis Martin
Moderator
SQL-Server-Performance.com One of the symptoms of an approaching nervous breakdown is the belief that one’s work is terribly important
Bertrand Russell
All postings are provided “AS IS” with no warranties for accuracy.
Una consulta, como puedo rastrear los triggers, un programador dejo uno que si el material llegaba al almacen, la orden de compra se liquidaba total o parcial, pero parece que no lo esta haciendo bien, me anula los documentos, pense que era la aplicacion, le hago seguimiento y nada, lo llevo al analizador de consulta y no sale nada, como si actualizace todo bien pero debe ser ese trigger.
Una forma que inclusive sirve para documentar, es TuBase–>Boton Derecho–> Scrip Database.
Recorre los tabs y no te olvides de tildar index, etc.
Luis Martin
Moderator
SQL-Server-Performance.com One of the symptoms of an approaching nervous breakdown is the belief that one’s work is terribly important
Bertrand Russell
All postings are provided “AS IS” with no warranties for accuracy.
Hola a todos
En el trigger de borraro intento hacer un insert de campos Ntext a otra tabla auxiliar
al crear el trigger me da un error que dice que no se puede usar campos Text, Ntext o Images en las tablas deleted o inserted Hay alguna manera de evitar esto Saludos Gracias de antemano

Te mando mi ejemplo modificado para evitar tu problema.
CREATE TABLE [LogDeMiTabla]
(
[nLog] [int] IDENTITY (1, 1) NOT NULL ,
[nKey] [int] NOT NULL ,
[tMiTexto]Text NULL,
[iMiImagen]image NULL,
[dGetDate] [datetime] NOT NULL ,
[cHostName] [nvarchar] (50) NOT NULL ,
[cUserName] [nvarchar] (50) NOT NULL ,
CONSTRAINT [PK_LogDeMiTabla] PRIMARY KEY CLUSTERED
([nLog])
) GO CREATE TABLE [MiTabla]
(
[nKey] [int] NOT NULL ,
[cDescripcion] [nvarchar] (100) NOT NULL ,
[tMiTexto]Text NULL,
[iMiImagen]image NULL
CONSTRAINT [PK_MiTabla] PRIMARY KEY CLUSTERED
([nKey])
)
GO
CREATE TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]
FOR DELETE
AS Insert [LogDeMiTabla]
(
[nKey],
[dGetDate],
[cHostName],
[cUserName],
[tMiTexto],
[iMiImagen]
)
Select m.[nKey],
getdate(),
Host_Name(),
sUser_sName(),
m.[tMiTexto],
m.[iMiImagen]
From Deleted d,
[MiTabla] m
Whered.nKey = m.nKey Go
–Agregamos unos valores a MiTabla Set nocount on Insert [MiTabla] Values (1,’Valor I’,’Texto I’,0xFFFFFFFF)
Insert [MiTabla] Values (2,’Valor II’,’Texto II’,0xFFFFFFFF)
Insert [MiTabla] Values (3,’Valor III’,’Texto III’,0xFFFFFFFF)
Insert [MiTabla] Values (4,’Valor IV’,’Texto IV’,0xFFFFFFFF)
Insert [MiTabla] Values (5,’Valor V’,’Texto V’,0xFFFFFFFF) –Borramos el registro con nKey =3 Delete [MiTabla] Where nKey = 3 –Verificamos que queda en MiTabla y en el Log Select * from [MiTabla]
Select * from [LogDeMiTabla] Saludos
Hola Carlos:
Siento decirte que no funciona el ejemplo que me has mandado, debe haber algo que no funciona correctamente, he probado con mis datos, y no hace el insert en la tabla log. Como no estaba muy seguro de haber hecho bien la traslacion a mi entorno, he probado directamente tu script pero tampoco hace el insert. Nacho
Lo lamento, Vamos denuevo: CREATE TABLE [LogDeMiTabla]
(
[nLog] [int] IDENTITY (1, 1) NOT NULL ,
[nKey] [int] NOT NULL ,
[tMiTexto]Text NULL,
[iMiImagen]image NULL,
[dGetDate] [datetime] NOT NULL ,
[cHostName] [nvarchar] (50) NOT NULL ,
[cUserName] [nvarchar] (50) NOT NULL ,
CONSTRAINT [PK_LogDeMiTabla] PRIMARY KEY CLUSTERED
([nLog])
) GO CREATE TABLE [MiTabla]
(
[nKey] [int] NOT NULL ,
[cDescripcion] [nvarchar] (100) NOT NULL ,
[tMiTexto]Text NULL,
[iMiImagen]image NULL
CONSTRAINT [PK_MiTabla] PRIMARY KEY CLUSTERED
([nKey])
)
GO
Alter TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]
INSTEAD OF DELETE
AS Insert [LogDeMiTabla]
(
[nKey],
[dGetDate],
[cHostName],
[cUserName],
[tMiTexto],
[iMiImagen]
)
Select m.[nKey],
getdate(),
Host_Name(),
sUser_sName(),
m.[tMiTexto],
m.[iMiImagen]
From Deleted d,
[MiTabla] m
Whered.nKey = m.nKey Delete[MiTabla]
From Deleted d,
[MiTabla] m
Whered.nKey = m.nKey Go
–Agregamos unos valores a MiTabla Set nocount on Insert [MiTabla] Values (1,’Valor I’,’Texto I’,0xFFFFFFFF)
Insert [MiTabla] Values (2,’Valor II’,’Texto II’,0xFFFFFFFF)
Insert [MiTabla] Values (3,’Valor III’,’Texto III’,0xFFFFFFFF)
Insert [MiTabla] Values (4,’Valor IV’,’Texto IV’,0xFFFFFFFF)
Insert [MiTabla] Values (5,’Valor V’,’Texto V’,0xFFFFFFFF) –Borramos el registro con nKey =3 Delete [MiTabla] Where nKey = 3 –Verificamos que queda en MiTabla y en el Log Select * from [MiTabla]
Select * from [LogDeMiTabla]
Por favor, cambiame la linea ALTER TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla] por CREATE TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]
Genial! <img src=’/community/emoticons/emotion-1.gif’ alt=’:)‘ />)<br /><br />Ahora funciona<br />Entiendo que lo que has hecho es, que no borre el registro, haces el insert y despues el delete a mano verdad?<br /><br />Una ultima pregunta que significa Set nocount on?<br /><br />Muchisimas gracias<br /><br />Un saludos<br />Nacho<br />
La interpretacion es correcta.
Cuando usaba FOR DELETE, al el momento en que se dispara el trigger el delete ya pasó, y por eso no podía sacarle los datos viejos a la tabla original. Te cuento que la única restricción que vas a tener es que no vas a poder declarar una clave foranea hacia la tabla original (MiTabla) con DELETE en Cascada. SET NOCOUNT ON Es una opción que le indica a SQL Server que no envíe al cliente la cantidad de registros afectada, viste ese mensaje tipo: (4 row(s) affected) Esto evita que se envíen paquetes innecesarios por la red. Por regla yo lo pongo en todo procedimiento y trigger. Saludos
La clausula INSTEAD OF, funciona en un SQL server 7?
No, aparece en SQL SERVER 2000
]]>