Je úžasné, jak rychle mohou být některé funkce ve světě softwaru zastaralé.
Tento článek představuje dvě metody, jak zjistit, zda jsou v instanci serveru SQL Server používány zastaralé funkce.
Metoda 1 – sys.dm_os_performance_counters
Snad nejrychlejší způsob, jak to udělat, je použít sys.dm_os_performance_counters
pohled na dynamickou správu systému. Mezi mnoha věcmi, které můžete s tímto zobrazením udělat, je získat seznam zastaralých funkcí spolu s tím, kolikrát byly použity od spuštění SQL Server.
Zde je příklad převzatý z mého článku Nejrychlejší způsob, jak najít zastaralé funkce, které se stále používají v instanci 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;
Výsledek:
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
V tomto příkladu vracím pouze ty řádky, kde je object_name
sloupec má hodnotu SQLServer:Deprecated Features
a cntr_value
hodnota sloupce je větší než nula.
Můžete odstranit cntr_value
sloupec z tohoto dotazu vrátit všechny zastaralé funkce, včetně těch, které nebyly použity.
Metoda 2 – použití rozšířených událostí
Dalším způsobem, jak to udělat, je použít rozšířené události. Toto je komplexnější metoda a můžete ji použít k vytvoření souboru protokolu, který obsahuje všechny instance použití zastaralé funkce, spolu s použitým příkazem SQL, který obsahuje zastaralou funkci, kdo ji spustil, databázi, proti které byla spuštěna atd. Níže je uveden příklad.
Vytvořte událost:
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 );
Spusťte událost:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Spusťte nějaký zastaralý kód:
SELECT * FROM sys.sql_dependencies;
Přečtěte si protokol:
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);
Výsledek (při použití vertikálního výstupu):
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.
Podrobnější diskusi o této metodě najdete v tématu Použití rozšířených událostí k protokolování zastaralých funkcí používaných v instanci SQL Server. Tento článek obsahuje stejný příklad, ale trochu podrobněji.