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.