none
Query que me diga, que tablas toco un sistema SQL server RRS feed

  • Pregunta

  • Hola buenas tardes, hay un sistema de información que utiliza una base de datos de sql server, en unas tablas a la que apunta ese sistema se almacena información la cual quiero extraer, pero quería preguntarles antes de ponerme a revisar tabla por tabla, si existe un consulta que me diga que tabla toco cuando desde el sistema realice el insert o update, espero haberme explicado bien, Gracias

    lunes, 29 de julio de 2019 16:30

Respuestas

  • Hola Vladimir Angarita:

    El sistema dispone de vistas para eso, pero no son fáciles de identificar y/o trabajar. Ya que no son solo, las nuestras, sino todo lo que hace el propio sistema.

    Un ejemplo

    CREATE TABLE mitabla
    (ID          INT IDENTITY(1, 1), 
     DESCRIPTION VARCHAR(100)
    );
    GO
    /* INSERTAMOS REGISTROS */
    INSERT INTO MITABLA (DESCRIPTION)
    VALUES
    ('A'),
    ('B'),
    ('C'),
    ('D');
    /* ACTUALIZAMOS REGISTROS */
    UPDATE mitabla SET DESCRIPTION = 'AAA' 
    WHERE ID = SCOPE_IDENTITY();
    /* RECOGEMOS DEL SISTEMA LAS ULTIMAS 10 CONSULTAS EJECUTADAS POR FECHA DE EJECUCIÓN */
    SELECT TOP 10 
    QT.TEXT AS QUERYTEXT
    FROM SYS.DM_EXEC_QUERY_STATS QS
    CROSS APPLY SYS.DM_EXEC_SQL_TEXT(QS.PLAN_HANDLE) AS QT
    ORDER BY QS.LAST_EXECUTION_TIME DESC;
    

    sys.dm_exec_query_stats

    https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-stats-transact-sql?view=sql-server-2017

    Salida

    lunes, 29 de julio de 2019 21:34

Todas las respuestas

  • Hola Vladimir Angarita:

    Si la pregunta, es si por defecto existe algún sistema que identifique cada fila, si ha sido insertada o actualizada, pero sin que nadie haya programado nada al respecto, la respuesta es no.

    Existen varias maneras de reflejar esto, pero siempre es porque se ha programado para hacerlo.

    Es sobre todo por una cuestión de ocupación de datos, ya que registrarlo todo de todos, por todas las veces, por cada cambio, puede llegar a ocupar mucho espacio, por tanto, nos dan las herramientas para hacerlo, pero es cosa de los programadores, implementarlo.

    Un ejemplo

    Versionado de tablas

    https://javifer2.blogspot.com/search/label/auditor%C3%ADa%20control%20versiones

    lunes, 29 de julio de 2019 18:14
  • No que me identifique Fila, sino que me diga, que tabla se a tocado en el momento que desde mi aplicacion realizo un insert, que podria ser a varias tablas, inmagina que nada mas hay un usuario conectado al sistema y realiza el insert, por debajo es decir por sql server existe algun tipo de query que me diga, que tablas se a tocado en el momento en que se corra ese query de insert?? no me interesa de momento que fila inserto, sino cuantas tablas toco o se utilizo en ese insert, Gracias
    lunes, 29 de julio de 2019 18:53
  • Hola, 

    La única forma seria consultar como se arma el query desde el programa hacerle debug y ver que consulta esta ejecutando o por el contrario para futuras coasiones podrias realizar un trigger que sobre cada elemento que vas a afectar y guardar un log en la BD pero perse saber que se ha modificado sin tener conocimiento de la consulta es muy complido abria que comprar cada objeto y ver que ha cambiado en el tiempo para detectarlo.

    Saludos.

    lunes, 29 de julio de 2019 19:08
  • Ese es detalle, es una aplicacion de la que no tengo acceso al codigo, solo se que apunta a una base de datos de ql server y sus tablas, pero nose en que orden registra y en que tablas, pense que existia algun tipo de query de sql server que me dijera que tablas se an tocado en el momento que corra el query
    lunes, 29 de julio de 2019 19:17
  • No, en ese sentido sentido seria una vulnerabilidad, la única forma es que quien diseño la aplicación te diga que objetos afectan las consultas en la base de datos.

    Ahora hay una forma poco recomendada y es que si necesitas saber solo las tablas que afectan te aconsejo que realices un tirgger por cada tabla que tienes, si tienes 20 tablas serán 20 triggers, si son 50 serán 50 triggers y asi... y los desarrollaria luego de que haga un insert o un update que es lo mas posible que haga tu aplicación. y en el cuerpo triguer definiera un especie de log que me diga que tabla se "ha disparado"... al final solo consulto ese log y con ello ya sabría que tablas se han modificado.

    Esto puede ser igual de engorroso que ver tabla por tabla, sin embargo si tienes tablas ya pobladas y que no guarden campos de tipo fecha que te indiquen la tbala afectada la opcion planteo podria serte de mas ayuda, si por el contrario son tablas vacias es mas sencillo consultar tabla a tabla y ver cuales son las que tienen registros.

    Saludos

    lunes, 29 de julio de 2019 20:57
  • Hola Vladimir Angarita:

    El sistema dispone de vistas para eso, pero no son fáciles de identificar y/o trabajar. Ya que no son solo, las nuestras, sino todo lo que hace el propio sistema.

    Un ejemplo

    CREATE TABLE mitabla
    (ID          INT IDENTITY(1, 1), 
     DESCRIPTION VARCHAR(100)
    );
    GO
    /* INSERTAMOS REGISTROS */
    INSERT INTO MITABLA (DESCRIPTION)
    VALUES
    ('A'),
    ('B'),
    ('C'),
    ('D');
    /* ACTUALIZAMOS REGISTROS */
    UPDATE mitabla SET DESCRIPTION = 'AAA' 
    WHERE ID = SCOPE_IDENTITY();
    /* RECOGEMOS DEL SISTEMA LAS ULTIMAS 10 CONSULTAS EJECUTADAS POR FECHA DE EJECUCIÓN */
    SELECT TOP 10 
    QT.TEXT AS QUERYTEXT
    FROM SYS.DM_EXEC_QUERY_STATS QS
    CROSS APPLY SYS.DM_EXEC_SQL_TEXT(QS.PLAN_HANDLE) AS QT
    ORDER BY QS.LAST_EXECUTION_TIME DESC;
    

    sys.dm_exec_query_stats

    https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-stats-transact-sql?view=sql-server-2017

    Salida

    lunes, 29 de julio de 2019 21:34