{"id":44327,"date":"2026-06-29T22:30:07","date_gmt":"2026-06-29T20:30:07","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=44327"},"modified":"2026-06-29T22:30:07","modified_gmt":"2026-06-29T20:30:07","slug":"monitoring-mssql-database-files-in-zabbix","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/","title":{"rendered":"Monitoring MSSQL Database Files in Zabbix"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\" id=\"h-introduction\">Introduction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\" id=\"h-monitoring-microsoft-sql-server-database-files-is-an-important-part-of-infrastructure-supervision-a-database-reaching-its-storage-limit-can-rapidly-lead-to-application-outages-transaction-failures-or-even-complete-service-interruptions\">Monitoring Microsoft SQL Server database files is an important part of infrastructure supervision.<br>A database reaching its storage limit can rapidly lead to application outages, transaction failures, or even complete service interruptions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-initial-problem\">The Initial Problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In SQL Server, retrieving file information is relatively simple when working directly inside SQL Server Management Studio<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>database file size,<\/li>\n\n\n\n<li>used space,<\/li>\n\n\n\n<li>free space,<\/li>\n\n\n\n<li>auto-growth configuration,<\/li>\n\n\n\n<li>or maximum file size<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A common query used by many DBAs is the following:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUSE &#x5B;TEST]\n\nGO\n\nSELECT\n  DB_NAME(database_id) AS DBName,\n  Name AS Logical_Name,\n  Physical_Name AS &#x5B;PhysicalName],\n  CAST(ROUND(((size)\/128\/1024), 2) AS float) AS &#x5B;SizeGB],\n  CAST(ROUND((CAST(FILEPROPERTY(name, &#039;SpaceUsed&#039;) AS INT)\/128\/1024), 2) AS float) AS &#x5B;SpaceUsedGB],\n  CAST(ROUND((size\/128\/1024 - CAST(FILEPROPERTY(name, &#039;SpaceUsed&#039;) AS INT)\/128\/1024), 2) AS float) AS &#x5B;FreeSpaceGB],\n  ROUND(ISNULL(((CAST((fileproperty(name, &#039;SpaceUsed&#039;))\/128\/1024 as float)) \/ NULLIF((CAST(size\/128\/1024 as float)), 0)), 0)*100, 2) as &#x5B;SpaceUsed%],\n  CASE WHEN &#x5B;max_size] = -1 THEN &#x5B;max_size] ELSE CAST(ROUND(((max_size)\/128\/1024), 2) AS float) END AS &#x5B;MaxSizeGB],\n  CAST(ROUND((max_size\/128\/1024 - CAST(FILEPROPERTY(name, &#039;SpaceUsed&#039;) AS INT)\/128\/1024), 2) AS float) AS &#x5B;FreeSpaceGBtoMaxSize],\n  ROUND(ISNULL(((CAST((fileproperty(name, &#039;SpaceUsed&#039;))\/128\/1024 as float)) \/ NULLIF((CAST(max_size\/128\/1024 as float)), 0)), 0)*100, 2) as &#x5B;SpaceUsed%toMaxSize]\nFROM sys.master_files\nWHERE DB_NAME(database_id) = &#039;TEST&#039;\nORDER BY Logical_Name\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The initial query works perfectly for manual analysis in SQL Server Management Studio.<br>However, integrating it into Zabbix becomes more complicated because <code>sys.database_files<\/code> only returns information from the current database context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This means the query must be executed individually for every database using:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nUSE &#x5B;DatabaseName]\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">In small environments this remains manageable, but in larger infrastructures containing dozens or even hundreds of databases, maintaining static queries quickly becomes impractical.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To automate this process, we use:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsp_MSforeachdb\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">This SQL Server procedure dynamically executes the same query across every database on the instance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nEXEC sp_MSforeachdb &#039;\nUSE &#x5B;?]\n\nSELECT\n    DB_NAME(),\n    name,\n    physical_name\nFROM sys.database_files\n&#039;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The <code>?<\/code> placeholder is automatically replaced by the database name during execution, allowing SQL Server to iterate through all databases dynamically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At first glance, this seems to solve the problem entirely.<br>However, another limitation quickly appears: <code>sp_MSforeachdb<\/code> returns one independent result set per database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of producing a single structured dataset, SQL Server generates multiple separate tables:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nDatabase 1 result\n-----------------\nfile1\nfile2\n\nDatabase 2 result\n-----------------\nfile1\nfile2\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">While this output remains perfectly readable for a DBA inside SQL Server Management Studio, it becomes difficult to exploit inside Zabbix, especially for Low-Level Discovery and dependent items.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To solve this limitation, we redesigned the query architecture to centralize all results into a single temporary table, allowing Zabbix to consume one normalized dataset fully compatible with automatic discovery and scalable monitoring.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-zabbix-cannot-easily-use-this-output\">Why Zabbix Cannot Easily Use This Output<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zabbix works much better when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the result is normalized,<\/li>\n\n\n\n<li>the structure is predictable,<\/li>\n\n\n\n<li>and all rows belong to a single dataset.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With multiple independent result sets:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Low-Level Discovery becomes difficult,<\/li>\n\n\n\n<li>JSON conversion becomes complicated,<\/li>\n\n\n\n<li>dependent items cannot parse values correctly,<\/li>\n\n\n\n<li>preprocessing becomes unreliable.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The issue is therefore no longer the database context itself. The issue becomes the query output structure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-building-a-zabbix-compatible-query\">Building a Zabbix-Compatible Query<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To make the output usable inside Zabbix, the query had to be redesigned completely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The objective was no longer simply to retrieve MSSQL file information, but to transform multiple independent database results into a single normalized dataset compatible with Low-Level Discovery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The new query therefore introduces three important concepts:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dynamic iteration through all databases using <code>sp_MSforeachdb<\/code>,<\/li>\n\n\n\n<li>centralized data collection using a global temporary table,<\/li>\n\n\n\n<li>and a final unified output consumable by Zabbix dependent items.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The core logic becomes inside the <code>sp_MSforeachdb<\/code> execution.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nINSERT INTO ##Results\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Each database inserts its rows into the same centralized structure instead of returning independent result sets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At the end of the execution, the query simply returns:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSELECT * FROM ##Results\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The final output is now normalized instead of multiple disconnected tables.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Database<\/th><th>File<\/th><th>Type<\/th><th>Size<\/th><th>Free<\/th><\/tr><\/thead><tbody><tr><td>TEST<\/td><td>TEST_Data<\/td><td>Data<\/td><td>&#8230;<\/td><td>&#8230;<\/td><\/tr><tr><td>TEST<\/td><td>TEST_Log<\/td><td>Log<\/td><td>&#8230;<\/td><td>&#8230;<\/td><\/tr><tr><td>PROD<\/td><td>PROD_Data<\/td><td>Data<\/td><td>&#8230;<\/td><td>&#8230;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-complete-query\">The complete query<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSET NOCOUNT ON;\n\nDECLARE @Granularity VARCHAR(10) = NULL\nDECLARE @Database_Name sysname = NULL\n \nDECLARE @SQL VARCHAR(5000)\n\nIF EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE NAME = &#039;##Results&#039;)\nBEGIN\n    DROP TABLE ##Results\nEND\n\nCREATE TABLE ##Results (\n    &#x5B;Database Name] sysname,\n    &#x5B;File Name] sysname,\n    &#x5B;Physical Name] NVARCHAR(260),\n    &#x5B;File Type] VARCHAR(4),\n    &#x5B;Total Size in Bytes] BIGINT,\n    &#x5B;Available Space in Bytes] BIGINT,\n    &#x5B;Growth Units] VARCHAR(20),\n    &#x5B;Max File Size in Bytes] BIGINT\n)\n\nSELECT @SQL =\n&#039;USE &#x5B;?] \nINSERT INTO ##Results(\n    &#x5B;Database Name],\n    &#x5B;File Name],\n    &#x5B;Physical Name],\n    &#x5B;File Type],\n    &#x5B;Total Size in Bytes],\n    &#x5B;Available Space in Bytes],\n    &#x5B;Growth Units],\n    &#x5B;Max File Size in Bytes]\n)\nSELECT \n    DB_NAME(),\n    &#x5B;name],\n    physical_name,\n    CASE type\n        WHEN 0 THEN &#039;&#039;Data&#039;&#039;\n        WHEN 1 THEN &#039;&#039;Log&#039;&#039;\n    END,\n\n    -- TOTAL SIZE (bytes) SAFE\n    CAST(size AS BIGINT) * 8 * 1024,\n\n    -- FREE SPACE (bytes) SAFE\n    (CAST(size AS BIGINT) - CAST(FILEPROPERTY(&#x5B;name], &#039;&#039;SpaceUsed&#039;&#039;) AS BIGINT)) * 8 * 1024,\n\n    -- GROWTH\n    CASE is_percent_growth\n        WHEN 1 THEN CAST(growth AS varchar(20)) + &#039;&#039;%&#039;&#039;\n        ELSE CAST(CAST(growth AS BIGINT) * 8 * 1024 AS varchar(20))\n    END,\n\n    -- MAX SIZE (bytes) SAFE\n    CASE max_size\n        WHEN -1 THEN NULL\n        WHEN 268435456 THEN NULL\n        ELSE CAST(max_size AS BIGINT) * 8 * 1024\n    END\n\nFROM sys.database_files\nORDER BY type, file_id\n&#039;\n\nEXEC sp_MSforeachdb @SQL\n\n-- =========================\n-- RESULTATS\n-- =========================\n\nIF @Database_Name IS NULL\nBEGIN\n    IF @Granularity = &#039;Database&#039;\n    BEGIN\n        SELECT\n            T.&#x5B;Database Name],\n\n            T.&#x5B;Total Size in Bytes] AS &#x5B;DB Size (Bytes)],\n            T.&#x5B;Available Space in Bytes] AS &#x5B;DB Free (Bytes)],\n            T.&#x5B;Consumed Space in Bytes] AS &#x5B;DB Used (Bytes)],\n\n            D.&#x5B;Total Size in Bytes] AS &#x5B;Data Size (Bytes)],\n            D.&#x5B;Available Space in Bytes] AS &#x5B;Data Free (Bytes)],\n            D.&#x5B;Consumed Space in Bytes] AS &#x5B;Data Used (Bytes)],\n            CEILING(CAST(D.&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(D.&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Data Free %],\n\n            L.&#x5B;Total Size in Bytes] AS &#x5B;Log Size (Bytes)],\n            L.&#x5B;Available Space in Bytes] AS &#x5B;Log Free (Bytes)],\n            L.&#x5B;Consumed Space in Bytes] AS &#x5B;Log Used (Bytes)],\n            CEILING(CAST(L.&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(L.&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Log Free %]\n\n        FROM\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            GROUP BY &#x5B;Database Name]\n        ) T\n\n        INNER JOIN\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            WHERE &#x5B;File Type] = &#039;Data&#039;\n            GROUP BY &#x5B;Database Name]\n        ) D ON T.&#x5B;Database Name] = D.&#x5B;Database Name]\n\n        INNER JOIN\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            WHERE &#x5B;File Type] = &#039;Log&#039;\n            GROUP BY &#x5B;Database Name]\n        ) L ON T.&#x5B;Database Name] = L.&#x5B;Database Name]\n\n        ORDER BY T.&#x5B;Database Name]\n    END\n    ELSE\n    BEGIN\n        SELECT\n            &#x5B;Database Name],\n            &#x5B;File Name],\n            &#x5B;Physical Name],\n            &#x5B;File Type],\n            &#x5B;Total Size in Bytes] AS &#x5B;DB Size (Bytes)],\n            &#x5B;Available Space in Bytes] AS &#x5B;DB Free (Bytes)],\n            CEILING(CAST(&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Free Space %],\n            &#x5B;Growth Units],\n            &#x5B;Max File Size in Bytes] AS &#x5B;Grow Max Size (Bytes)]\n        FROM ##Results\n    END\nEND\nELSE\nBEGIN\n    IF @Granularity = &#039;Database&#039;\n    BEGIN\n        SELECT\n            T.&#x5B;Database Name],\n\n            T.&#x5B;Total Size in Bytes] AS &#x5B;DB Size (Bytes)],\n            T.&#x5B;Available Space in Bytes] AS &#x5B;DB Free (Bytes)],\n            T.&#x5B;Consumed Space in Bytes] AS &#x5B;DB Used (Bytes)],\n\n            D.&#x5B;Total Size in Bytes] AS &#x5B;Data Size (Bytes)],\n            D.&#x5B;Available Space in Bytes] AS &#x5B;Data Free (Bytes)],\n            D.&#x5B;Consumed Space in Bytes] AS &#x5B;Data Used (Bytes)],\n            CEILING(CAST(D.&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(D.&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Data Free %],\n\n            L.&#x5B;Total Size in Bytes] AS &#x5B;Log Size (Bytes)],\n            L.&#x5B;Available Space in Bytes] AS &#x5B;Log Free (Bytes)],\n            L.&#x5B;Consumed Space in Bytes] AS &#x5B;Log Used (Bytes)],\n            CEILING(CAST(L.&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(L.&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Log Free %]\n\n        FROM\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            WHERE &#x5B;Database Name] = @Database_Name\n            GROUP BY &#x5B;Database Name]\n        ) T\n\n        INNER JOIN\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            WHERE &#x5B;File Type] = &#039;Data&#039;\n              AND &#x5B;Database Name] = @Database_Name\n            GROUP BY &#x5B;Database Name]\n        ) D ON T.&#x5B;Database Name] = D.&#x5B;Database Name]\n\n        INNER JOIN\n        (\n            SELECT &#x5B;Database Name],\n                SUM(&#x5B;Total Size in Bytes]) AS &#x5B;Total Size in Bytes],\n                SUM(&#x5B;Available Space in Bytes]) AS &#x5B;Available Space in Bytes],\n                SUM(&#x5B;Total Size in Bytes] - &#x5B;Available Space in Bytes]) AS &#x5B;Consumed Space in Bytes]\n            FROM ##Results\n            WHERE &#x5B;File Type] = &#039;Log&#039;\n              AND &#x5B;Database Name] = @Database_Name\n            GROUP BY &#x5B;Database Name]\n        ) L ON T.&#x5B;Database Name] = L.&#x5B;Database Name]\n\n        ORDER BY T.&#x5B;Database Name]\n    END\n    ELSE\n    BEGIN\n        SELECT\n            &#x5B;Database Name],\n            &#x5B;File Name],\n            &#x5B;Physical Name],\n            &#x5B;File Type],\n            &#x5B;Total Size in Bytes] AS &#x5B;DB Size (Bytes)],\n            &#x5B;Available Space in Bytes] AS &#x5B;DB Free (Bytes)],\n            CEILING(CAST(&#x5B;Available Space in Bytes] AS decimal(20,2)) \/ NULLIF(&#x5B;Total Size in Bytes],0) * 100) AS &#x5B;Free Space %],\n            &#x5B;Growth Units],\n            &#x5B;Max File Size in Bytes] AS &#x5B;Grow Max Size (Bytes)]\n        FROM ##Results\n        WHERE &#x5B;Database Name] = @Database_Name\n    END\nEND\n\nDROP TABLE ##Results\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-discovery-in-zabbix\">Discovery in Zabbix<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the query has been implemented in Zabbix, the next step is to create a Low-Level Discovery (LLD) rule in order to automatically discover databases and files, then generate the associated dependent items and triggers dynamically.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"677\" height=\"242\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png\" alt=\"\" class=\"wp-image-44336\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png 677w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17-300x107.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A dedicated blog explaining how to configure Low-Level Discovery in Zabbix is available here: Create DISCO Put the link here<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Monitoring MSSQL database files in Zabbix can become challenging when working with multiple databases and dynamic environments.<br>While the initial query is perfectly suitable for manual analysis, its structure and dependency on the current database context make it difficult to integrate directly into Zabbix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By using <code>sp_MSforeachdb<\/code> together with a centralized temporary table, we can transform multiple independent result sets into a single normalized dataset fully compatible with Zabbix Low-Level Discovery and dependent items.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This approach provides a scalable and reusable solution capable of automatically monitoring database and log file growth across an entire SQL Server instance while significantly reducing manual configuration and maintenance efforts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<!--more-->\n","protected":false},"excerpt":{"rendered":"<p>Introduction Monitoring Microsoft SQL Server database files is an important part of infrastructure supervision.A database reaching its storage limit can rapidly lead to application outages, transaction failures, or even complete service interruptions. The Initial Problem In SQL Server, retrieving file information is relatively simple when working directly inside SQL Server Management Studio A common query [&hellip;]<\/p>\n","protected":false},"author":126,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,3683,99,3841],"tags":[143,1525,2430],"type_dbi":[3347],"class_list":["post-44327","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-monitoring","category-sql-server","category-zabbix","tag-monitoring","tag-mssql","tag-zabbix","type-monitoring"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Monitoring MSSQL Database Files in Zabbix - dbi Blog<\/title>\n<meta name=\"description\" content=\"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitoring MSSQL Database Files in Zabbix\" \/>\n<meta property=\"og:description\" content=\"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-29T20:30:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png\" \/>\n\t<meta property=\"og:image:width\" content=\"677\" \/>\n\t<meta property=\"og:image:height\" content=\"242\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Aur\u00e9lien Py\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Aur\u00e9lien Py\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/\"},\"author\":{\"name\":\"Aur\u00e9lien Py\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/48f0de87c5f62826f8b9fe6ba9c74968\"},\"headline\":\"Monitoring MSSQL Database Files in Zabbix\",\"datePublished\":\"2026-06-29T20:30:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/\"},\"wordCount\":657,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-17.png\",\"keywords\":[\"Monitoring\",\"mssql\",\"Zabbix\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Monitoring\",\"SQL Server\",\"Zabbix\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/\",\"name\":\"Monitoring MSSQL Database Files in Zabbix - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-17.png\",\"datePublished\":\"2026-06-29T20:30:07+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/48f0de87c5f62826f8b9fe6ba9c74968\"},\"description\":\"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-17.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/05\\\/image-17.png\",\"width\":677,\"height\":242},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/monitoring-mssql-database-files-in-zabbix\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Monitoring MSSQL Database Files in Zabbix\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/48f0de87c5f62826f8b9fe6ba9c74968\",\"name\":\"Aur\u00e9lien Py\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g\",\"caption\":\"Aur\u00e9lien Py\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/aurelienpy\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Monitoring MSSQL Database Files in Zabbix - dbi Blog","description":"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/","og_locale":"en_US","og_type":"article","og_title":"Monitoring MSSQL Database Files in Zabbix","og_description":"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.","og_url":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/","og_site_name":"dbi Blog","article_published_time":"2026-06-29T20:30:07+00:00","og_image":[{"width":677,"height":242,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png","type":"image\/png"}],"author":"Aur\u00e9lien Py","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Aur\u00e9lien Py","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/"},"author":{"name":"Aur\u00e9lien Py","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/48f0de87c5f62826f8b9fe6ba9c74968"},"headline":"Monitoring MSSQL Database Files in Zabbix","datePublished":"2026-06-29T20:30:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/"},"wordCount":657,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png","keywords":["Monitoring","mssql","Zabbix"],"articleSection":["Database Administration &amp; Monitoring","Monitoring","SQL Server","Zabbix"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/","url":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/","name":"Monitoring MSSQL Database Files in Zabbix - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png","datePublished":"2026-06-29T20:30:07+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/48f0de87c5f62826f8b9fe6ba9c74968"},"description":"Monitoring MSSQL Database Files in Zabbix with sp_MSforeachdb, temporary tables, and a unified query designed for Zabbix Low-Level Discovery.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/05\/image-17.png","width":677,"height":242},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/monitoring-mssql-database-files-in-zabbix\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Monitoring MSSQL Database Files in Zabbix"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/48f0de87c5f62826f8b9fe6ba9c74968","name":"Aur\u00e9lien Py","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/debb6755cf2d0643e345d2f738b8b9a2a1f6a0fdb5ca0284d491abdb5f86f75f?s=96&d=mm&r=g","caption":"Aur\u00e9lien Py"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/aurelienpy\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/126"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=44327"}],"version-history":[{"count":9,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44327\/revisions"}],"predecessor-version":[{"id":44337,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44327\/revisions\/44337"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=44327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=44327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=44327"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=44327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}