none
capturar quien modifico un procedimiento almacenado SQL SERVER RRS feed

  • Pregunta

  • Hola amigos, la siguiente consulta existe alguna forma de capturar los cambios que se realizaron sobre los procedimientos almacenados, tablas, funciones y que usuarios lo hicieron. esto para tener todo capturado y sobre todo quien realizo el cambio, por que tuve quejas de los developers que tuvieron cambios de la noche a la mañana de sus procedimientos almacenados.

    Por favor ayuda.

    Gracias


    diego

    miércoles, 22 de mayo de 2019 19:37

Respuestas

  • Estimado Javi Fernández  te comento que encontré una solución al inconveniente que tenia y fue crear un triguer a nivel de servidor, donde capturo CREATE, ALTER O DROP (DDL) de un objeto aquí el código para que lo implementen, primero se crea una base de datos y una tabla donde se almacenara toda la información

    ALTER TRIGGER [TrigguerAuditoriaDDL] ON ALL SERVER
    FOR
    ------------------
    CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
    ------------------
    CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
    ------------------
    CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
    ------------------
    CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
    -----------------
    CREATE_INDEX, DROP_INDEX
    AS
         BEGIN
             SET NOCOUNT ON;
             DECLARE @EventData XML= EVENTDATA();
             DECLARE @ip VARCHAR(48)= CONVERT(VARCHAR(48), CONNECTIONPROPERTY('client_net_address'));
             INSERT INTO [BD_LOGS_DDL].[EVENT_DATA].[DDL_EVENTS]
             ([ADICIONADO_POR],
              [FECHA_ADICION],
              [USER_HOST_NAME],
              [USER_IP_ADDRESS],
              [OBJETO_TIPO],
              [ACCION],
              [BASE_DATOS],
              [ESQUEMA],
              [OBJETO_NOMBRE],
              [DDL],
              [EVENTO_XML],
              [APLICACION_NOMBRE]
             )
                    SELECT SUSER_SNAME(),
                           GETDATE(),
                           HOST_NAME(),
                           @ip,
                           @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'NVARCHAR(100)'),
                           @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
                           @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'NVARCHAR(MAX)'),
                           @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
                           @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'),
                           @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
                           @EventData,
                           PROGRAM_NAME();
         END;
    GO


    diego

    jueves, 23 de mayo de 2019 21:58

Todas las respuestas

  • Hola Diego Javier Quispe Sullca:

    Tienes posibles soluciones, pero las auditorías, todas tienen problemas, y es que registran datos, y al cabo de un tiempo se convierten en una parte del problema.

    Aquí tienes un excelente artículo, escrito por Minette Steynberg, que te indica muchas de las posibilidades de auditoría a este nivel.

    Auditorías

    https://www.sqlshack.com/es/creando-una-estrategia-de-auditoria-exitosa-para-sus-bases-de-datos-sql-server/

    Adicionalmente, también te puede servir la auditoría de acciones.

    Auditoría de acciones

    https://javifer2.blogspot.com/search/label/auditor%C3%ADa%20de%20acciones

    • Propuesto como respuesta eRiver1 miércoles, 22 de mayo de 2019 20:31
    miércoles, 22 de mayo de 2019 20:11
  • Estimado Javi Fernández  te comento que encontré una solución al inconveniente que tenia y fue crear un triguer a nivel de servidor, donde capturo CREATE, ALTER O DROP (DDL) de un objeto aquí el código para que lo implementen, primero se crea una base de datos y una tabla donde se almacenara toda la información

    ALTER TRIGGER [TrigguerAuditoriaDDL] ON ALL SERVER
    FOR
    ------------------
    CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
    ------------------
    CREATE_TABLE, ALTER_TABLE, DROP_TABLE,
    ------------------
    CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
    ------------------
    CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER,
    -----------------
    CREATE_INDEX, DROP_INDEX
    AS
         BEGIN
             SET NOCOUNT ON;
             DECLARE @EventData XML= EVENTDATA();
             DECLARE @ip VARCHAR(48)= CONVERT(VARCHAR(48), CONNECTIONPROPERTY('client_net_address'));
             INSERT INTO [BD_LOGS_DDL].[EVENT_DATA].[DDL_EVENTS]
             ([ADICIONADO_POR],
              [FECHA_ADICION],
              [USER_HOST_NAME],
              [USER_IP_ADDRESS],
              [OBJETO_TIPO],
              [ACCION],
              [BASE_DATOS],
              [ESQUEMA],
              [OBJETO_NOMBRE],
              [DDL],
              [EVENTO_XML],
              [APLICACION_NOMBRE]
             )
                    SELECT SUSER_SNAME(),
                           GETDATE(),
                           HOST_NAME(),
                           @ip,
                           @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'NVARCHAR(100)'),
                           @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
                           @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'NVARCHAR(MAX)'),
                           @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)'),
                           @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)'),
                           @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
                           @EventData,
                           PROGRAM_NAME();
         END;
    GO


    diego

    jueves, 23 de mayo de 2019 21:58