我的目标是获取已删除文件的SQL Server数据库列表。 换一种说法。我从挂载中附加了一个数据库,然后关闭了挂载,所以实际上我有一个不带文件的附加数据库。
起初,这似乎很容易。选择起来很简单:
SELECT
'DB_NAME' = db.name,
'FILE_NAME' = mf.name,
'FILE_TYPE' = mf.type_desc,
'FILE_PATH' = mf.physical_name
FROM
sys.databases db
INNER JOIN sys.master_files mf
ON db.database_id = mf.database_id
WHERE
--and specific condition here
但是结果却有所不同。 Sql Server具有与常规数据库和没有文件的数据库几乎相同的信息。所以我不得不尝试其他东西。
我还尝试使用数据库state
。这很奇怪。
不幸的是,以下query
给我错误(或没有提供实际信息):
SELECT state
FROM sys.databases
WHERE name = N'TestDB'
state
-----
0
根据此link,0
的意思是ONLINE
但是实际上数据库具有RECOVERY_PENDING
状态。看来有关我的TestDB
我们的sql服务器信息已过期,应该刷新。但是我不知道如何实现这一目标。但是在执行以下任何查询之后,此信息(db state
)将被刷新:
EXEC sp_helpdb N'TestDB'
ALTER DATABASE N'TestDB' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
USE N'TestDB'
--etc
--all requests are terminated with the same error
Msg 5120, Level 16, State 101, Line 10
Unable to open the physical file "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf". Operating system error 3: "3(The system cannot find the path specified.)".
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf" may be incorrect.
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 10
Could not restart database "TestDB". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 10
ALTER DATABASE statement failed.
那么你有什么主意吗? 而且我还问过这个问题here与此不同。
答案 0 :(得分:0)
最后,我已经找到了我真正需要的东西。 我可以通过sql server检查特定文件是否存在:
CREATE FUNCTION dbo.fn_FileExists(@path varchar(512))
RETURNS BIT
AS
BEGIN
DECLARE @result INT
EXEC master.dbo.xp_fileexist @path, @result OUTPUT
RETURN cast(@result as bit)
END;
GO
所以我只需要为每个文件执行上面的功能,我可以通过执行以下查询来获取该文件:
SELECT
DISTINCT 'FILE_PATH' = physical_name
FROM sys.master_files