Published on

April 10, 2005

Проверка статуса файлов в SQL Server

Администраторы баз данных SQL Server часто должны копировать большие файлы, такие как полные файлы резервной копии и файлы журнала транзакций, из одной среды в другую. Однако, когда они хотят восстановить или импортировать эти файлы, им приходится ждать, пока процесс копирования не завершится. В SQL Server есть три способа проверить статус файла:

  1. Exec master.. Xp_getfiledetails
  2. Exec master.. XP_Cmdshell
  3. Exec master.. XP_FILEEXIST

Первый метод, Xp_getfiledetails, сообщает, что файл существует и предоставляет более подробную информацию о файле. Второй метод, XP_Cmdshell, выполняет команду MS-DOS и подтверждает, что файл существует и был создан. Третий метод, XP_FILEEXIST, также сообщает, что файл существует.

Однако, когда файл копируется, эти три оператора ложно сообщают, что файл существует и готов к использованию. Чтобы узнать реальный статус файла, мы можем создать пользовательскую функцию, используя SP_Oamethod и объект файловой системы.

Вот пример того, как создать функцию udf_CheckFileStatus:

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

CREATE FUNCTION udf_CheckFileStatus (@filename varchar(1000))
RETURNS bit
AS
BEGIN
    DECLARE @FS int
    DECLARE @OLEResult int
    DECLARE @FileID int
    DECLARE @source NVARCHAR(255)
    DECLARE @description NVARCHAR(255)
    DECLARE @flag bit
    
    SET @source ='Exist'
    SET @description='Exist'
    
    EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
    
    IF @OLEResult <> 0  
    BEGIN
        EXEC sp_OAGetErrorInfo NULL, @source OUTPUT, @description OUTPUT 
        GOTO displayerror
    END
    
    -- Открыть файл
    EXECUTE @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @filename, 1
    
    IF @OLEResult <> 0  
    BEGIN
        EXEC sp_OAGetErrorInfo NULL, @source OUTPUT, @description OUTPUT 
        GOTO displayerror
    END
    
    EXECUTE @OLEResult = sp_OADestroy @FileID
    EXECUTE @OLEResult = sp_OADestroy @FS
    
displayerror:
    IF @source IS NULL AND @description IS NULL
    BEGIN
        SET @flag = 1
    END
    ELSE
    BEGIN
        SET @flag = 0
    END
    
    RETURN @flag
END

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

С помощью этой пользовательской функции теперь вы можете проверить реальный статус файла. Если функция возвращает 1, это означает, что файл используется и к нему нельзя получить доступ. Если она возвращает 0, файл готов к использованию.

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

Скачайте файл udf_CheckFileStatus.sql, чтобы реализовать эту функцию в вашей среде SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.