sql >> Base de Datos >  >> RDS >> Sqlserver

2 formas de ver si las funciones obsoletas todavía se utilizan en una instancia de SQL Server

Es sorprendente lo rápido que algunas funciones pueden quedar obsoletas en el mundo del software.

Este artículo presenta dos métodos para ver si las funciones obsoletas se están utilizando en una instancia de SQL Server.

Método 1:sys.dm_os_performance_counters

Quizás la forma más rápida de hacerlo es usar sys.dm_os_performance_counters vista de gestión dinámica del sistema. Entre las muchas cosas que puede hacer con esta vista, se encuentra obtener una lista de funciones obsoletas, junto con cuántas veces se han utilizado desde que se inició SQL Server.

Aquí hay un ejemplo tomado de mi artículo La forma más rápida de encontrar características obsoletas que todavía se usan en una instancia de SQL Server:

SELECT
  RTRIM(instance_name) 'Feature', 
  cntr_value 'Usage Count'
FROM sys.dm_os_performance_counters   
WHERE object_name = 'SQLServer:Deprecated Features'
AND cntr_value > 0;

Resultado:

+-----------------------------------+---------------+
| Feature                           | Usage Count   |
|-----------------------------------+---------------|
| String literals as column aliases | 1             |
| TIMESTAMP                         | 1             |
| numbered_procedures               | 1             |
| sysdatabases                      | 3             |
| sp_db_vardecimal_storage_format   | 1             |
| XP_API                            | 2             |
+-----------------------------------+---------------+

En este ejemplo, solo devuelvo aquellas filas donde object_name la columna tiene un valor de SQLServer:Deprecated Features y el cntr_value el valor de la columna es mayor que cero.

Podría eliminar el cntr_value columna de esta consulta para devolver todas las funciones obsoletas, incluidas las que no se han utilizado.

Método 2:usar eventos extendidos

Otra forma de hacerlo es usar eventos extendidos. Este es un método más completo y puede usarlo para crear un archivo de registro que contenga todas las instancias de uso de funciones obsoletas, junto con la instrucción SQL utilizada que contiene la función obsoleta, quién la ejecutó, la base de datos contra la que se ejecutó, etc. A continuación se muestra un ejemplo.

Crea el evento:

CREATE EVENT SESSION [Deprecation Events] ON SERVER 
ADD EVENT sqlserver.deprecation_announcement(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
        )
),
ADD EVENT sqlserver.deprecation_final_support(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
    )
)
ADD TARGET package0.event_file(
    SET filename=N'/var/opt/mssql/tmp/DeprecationEvents.xel'
    )
WITH (
    TRACK_CAUSALITY = ON
    );

Iniciar el evento:

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

Ejecute un código obsoleto:

SELECT * FROM sys.sql_dependencies;

Lea el registro:

SELECT
    EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
    EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username,
    EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name,
    EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text,
    EventXml.value('(@name)[1]', 'varchar(50)') AS event_name,
    EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature,
    EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message
FROM (SELECT CAST(event_data AS XML) AS XmlEventData
    FROM sys.fn_xe_file_target_read_file (
        '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
        null, 
        null, 
        null
    )) AS EventTable
CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml);

Resultado (usando salida vertical):

timestamp     | 2019-10-31 04:03:06.5280000
username      | sa
database_name | Test
sql_text      | SELECT * FROM sys.sql_dependencies;
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.

Para obtener una discusión más detallada sobre este método, consulte Uso de eventos extendidos para registrar funciones obsoletas que se usan en una instancia de SQL Server. Ese artículo incluye el mismo ejemplo, pero con un poco más de detalle.