Удивително е колко бързо някои функции могат да отпаднат в света на софтуера.
Тази статия представя два метода, за да видите дали оттеглените функции се използват в екземпляр на SQL Server.
Метод 1 – sys.dm_os_performance_counters
Може би най-бързият начин да го направите е да използвате sys.dm_os_performance_counters
изглед за динамично управление на системата. Сред многото неща, които можете да правите с този изглед, е да получите списък с оттеглените функции, заедно с това колко пъти са били използвани от стартирането на SQL Server.
Ето пример, взет от моята статия Най-бързият начин за намиране на остарели функции, които все още се използват в екземпляр на 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;
Резултат:
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
В този пример връщам само онези редове, където object_name
колоната има стойност SQLServer:Deprecated Features
и cntr_value
стойността на колоната е по-голяма от нула.
Можете да премахнете cntr_value
колона от тази заявка, за да върне всички оттеглени функции, включително тези, които не са били използвани.
Метод 2 – Използвайте разширени събития
Друг начин да го направите е да използвате разширени събития. Това е по-изчерпателен метод и можете да го използвате, за да създадете регистрационен файл, който съдържа всички случаи на използване на оттеглена функция, заедно с използвания SQL оператор, който съдържа оттеглената функция, кой я е стартирал, базата данни, срещу която е била стартирана и т.н. По-долу е даден пример.
Създайте събитието:
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 );
Започнете събитието:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Изпълнете някакъв остарял код:
SELECT * FROM sys.sql_dependencies;
Прочетете дневника:
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);
Резултат (с помощта на вертикален изход):
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.
За по-подробна дискусия относно този метод вижте Използване на разширени събития за регистриране на остарели функции, използвани в екземпляр на SQL сървър. Тази статия включва същия пример, но с малко повече подробности.