Удивително е колко бързо някои функции могат да отпаднат в света на софтуера.
Тази статия представя два метода, за да видите дали оттеглените функции се използват в екземпляр на 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 сървър. Тази статия включва същия пример, но с малко повече подробности.