Администраторы баз данных SQL Server часто должны копировать большие файлы, такие как полные файлы резервной копии и файлы журнала транзакций, из одной среды в другую. Однако, когда они хотят восстановить или импортировать эти файлы, им приходится ждать, пока процесс копирования не завершится. В SQL Server есть три способа проверить статус файла:
- Exec master.. Xp_getfiledetails
- Exec master.. XP_Cmdshell
- 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.