SQL Server Performance

Log de borrado de registros

Discussion in 'Preguntas sobre SQL Server en Español.' started by naguinaga, Jan 20, 2005.

  1. naguinaga New Member

    Hola a tod@s:

    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
  2. c_maldon Member

    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
  3. naguinaga New Member

    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
  4. Luis Martin Moderator

    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.



  5. fjac_pe New Member

    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.
  6. Luis Martin Moderator

    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.



  7. naguinaga New Member

    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
  8. c_maldon Member

    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
  9. naguinaga New Member

    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
  10. c_maldon Member

    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]

  11. c_maldon Member

    Por favor, cambiame la linea

    ALTER TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]

    por

    CREATE TRIGGER [TR_Log_MiTabla] ON [dbo].[MiTabla]

  12. naguinaga New Member

    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 />
  13. c_maldon Member

    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

  14. naguinaga New Member

    La clausula INSTEAD OF, funciona en un SQL server 7?
  15. c_maldon Member

    No, aparece en SQL SERVER 2000

Share This Page