Как выбрать все файлы базы данных SQL Server из папки BLOB-объектов? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть SQL База данных сервера.

Вы можете использовать следующий скрипт для создания аналогичной базы данных:

CREATE DATABASE [test]
CONTAINMENT = NONE
ON PRIMARY 
   (NAME = N'test', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
   FILEGROUP [FS] CONTAINS FILESTREAM  DEFAULT
   (NAME = N'FS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS' , MAXSIZE = UNLIMITED)
   LOG ON 
   (NAME = N'test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test_log.ldf', SIZE = 8192KB, MAXSIZE = 2048GB, FILEGROWTH = 65536KB )
GO

Понятно, как выбрать все файлы базы данных:

select * from sys.database_files

file_id     file_guid                            type type_desc                                                    data_space_id name                                                                                                                             physical_name                                                                                                                                                                                                                                                    state state_desc                                                   size        max_size    growth      is_media_read_only is_read_only is_sparse is_percent_growth is_name_reserved is_persistent_log_buffer create_lsn                              drop_lsn                                read_only_lsn                           read_write_lsn                          differential_base_lsn                   differential_base_guid               differential_base_time  redo_start_lsn                          redo_start_fork_guid                 redo_target_lsn                         redo_target_fork_guid                backup_lsn
----------- ------------------------------------ ---- ------------------------------------------------------------ ------------- -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----- ------------------------------------------------------------ ----------- ----------- ----------- ------------------ ------------ --------- ----------------- ---------------- ------------------------ --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ------------------------------------ ----------------------- --------------------------------------- ------------------------------------ --------------------------------------- ------------------------------------ ---------------------------------------
1           07DE2F09-B9C3-4CC9-AC7F-C7BBEDBFE572 0    ROWS                                                         1             test                                                                                                                             C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test.mdf                                                                                                                                                                                     0     ONLINE                                                       1024        -1          8192        0                  0            0         0                 0                0                        NULL                                    NULL                                    NULL                                    NULL                                    NULL                                    NULL                                 NULL                    NULL                                    NULL                                 NULL                                    NULL                                 NULL
2           25C00910-F2F0-48EF-8AE6-DB3E947DF0F3 1    LOG                                                          0             test_log                                                                                                                         C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\test_log.ldf                                                                                                                                                                                 0     ONLINE                                                       1024        268435456   8192        0                  0            0         0                 0                0                        NULL                                    NULL                                    NULL                                    NULL                                    NULL                                    NULL                                 NULL                    NULL                                    NULL                                 NULL                                    NULL                                 NULL
65537       DB6C446D-E1E1-4F5B-BC27-92168A94A92B 2    FILESTREAM                                                   2             FS                                                                                                                               C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS                                                                                                                                                                                           0     ONLINE                                                       0           -1          0           0                  0            0         0                 0                0                        36000000012900001                       NULL                                    NULL                                    NULL                                    NULL                                    NULL                                 NULL                    NULL                                    NULL                                 NULL                                    NULL                                 NULL

(3 rows affected)

Теперь давайте создадим таблицу с BLOB-объектами:

USE [test]

CREATE TABLE TestBlob
(
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE, 
    [tbBin] VARBINARY(MAX) FILESTREAM NULL
)
GO

и поместим туда некоторые данные:

USE [test]

INSERT INTO TestBlob (Id, tbBin)
    SELECT NEWID(), BulkColumn FROM OPENROWSET(Bulk 'C:\Everyone\small', Single_Blob) AS tb 

INSERT INTO TestBlob (Id, tbBin)
    SELECT NEWID(), BulkColumn FROM OPENROWSET(Bulk 'C:\Everyone\another', Single_Blob) AS tb 

Теперь папка BLOB-объектов выглядит следующим образом:

cmd> tree "C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS" /F

C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS
│   filestream.hdr
│
├───$FSLOG
└───f4bf1197-bb52-4246-95ba-4b7622065c19
    └───4cf08168-3853-4c3d-ada2-4a1ff8d19900
            00000024-000000b1-0002
            00000024-000000cd-0002

Мне нужен запрос T- SQL, чтобы выбрать все BLOB-файлы базы данных.

Здесь представлены следующие файлы (их использует моя база данных):

00000024-000000b1-0002
00000024-000000cd-0002

Любой может помочь мне с этим?

Я также знаю, что можно использовать недокументированную хранимую процедуру:

EXEC master.sys.xp_dirtree 'C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS',0,1;

subdirectory                                                                                                                                                                                                                                                     depth       file
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- -----------
$FSLOG                                                                                                                                                                                                                                                           1           0
f4bf1197-bb52-4246-95ba-4b7622065c19                                                                                                                                                                                                                             1           0
4cf08168-3853-4c3d-ada2-4a1ff8d19900                                                                                                                                                                                                                             2           0
00000024-000000b1-0002                                                                                                                                                                                                                                           3           1
00000024-000000cd-0002                                                                                                                                                                                                                                           3           1
filestream.hdr                                                                                                                                                                                                                                                   1           1

(6 rows affected)

Но она работает с файловой системой. Я имею в виду, он не учитывает, используется ли файл базой данных или нет.

1 Ответ

0 голосов
/ 26 февраля 2020

Как вы, наверное, заметили, ваш BLOB-объект хранится в двух папках в GUID.

f4bf1197-bb52-4246-95ba-4b7622065c19 - это ссылка на вашу таблицу 4cf08168-3853-4c3d-ada2-4a1ff8d19900 - это ваша колонка ссылка

Если у вас есть несколько больших двоичных объектов, то у вас будет несколько подпапок.

Вероятно, вы можете получить запрос из этой статьи.

https://www.sqlskills.com/blogs/paul/filestream-directory-structure-where-do-the-guids-come-from/

SELECT
    [o].[name] AS [Table],
    [cp].[name] AS [Column],
    [p].[partition_number] AS [Partition],
    [r].[rsguid] AS [Rowset GUID],
    [rs].[colguid] AS [Column GUID]
FROM sys.sysrowsets [r] CROSS APPLY sys.sysrscols [rs]
JOIN sys.partitions [p]
    ON [rs].[rsid] = [p].[partition_id]
JOIN sys.objects [o]
    ON [o].[object_id] = [p].[object_id]
JOIN sys.syscolpars [cp]
    ON [cp].[colid] = [rs].[rscolid]
WHERE [rs].[colguid] IS NOT NULL
    AND [o].[object_id] = [cp].[id]
    AND [r].[rsguid] IS NOT NULL
    AND [r].[rowsetid] = [rs].[rsid];
GO

Обратите внимание, что в новой серверной редакции sql базовые таблицы больше недоступны.

Я бы посоветовал рассмотреть возможность использования файловых таблиц, как прокомментировали другие пользователи.

Следующая статья объяснит вам, с чего начать.

https://www.sqlshack.com/sql-server-filetable-the-next-generation-of-sql-filestream/

  • SQL сервер сделает всю работу и представит вашу файловую команду как папку и файлы.
  • разрешение вашей файловой таблицы будет отражено в общей папке

Или вы можете просто продолжить свою технику master.sys.xp_dirtree.

https://www.patrickkeisler.com/2012/11/how-to-use-xpdirtree-to-list-all-files.html

предположите, что вам нужен файл и 3 глубокий и файл, поскольку $ FSLOG имеют значение 2 глубоких

DECLARE @DirectoryTree TABLE (
    id INT IDENTITY(1, 1)
    ,subdirectory NVARCHAR(512)
    ,depth INT
    ,isfile BIT
    );

INSERT INTO @DirectoryTree
EXEC master.sys.xp_dirtree 'C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL14.SQLEXPRESS\MSSQL\DATA\FS'
    ,3
    ,1

SELECT *
FROM @DirectoryTree
WHERE depth = 3
    AND isfile = 1

Не забывайте, что вы можете получить дублированный идентификатор файла. Рассмотрим альтернативу FileTable.

...