如果 SQL 服务器中存在具有逻辑名称的变量,如何删除数据库?

How to drop a database if a variable with its logical name exists in SQL Server?

我创建了一个包含数据库逻辑名称的变量,如果它存在于我的 LocalDB 中,则删除它。

我在当前代码中面临的问题是它只搜索现有数据库的物理名称。

(我有一个逻辑名称为 'Development' 的数据库,它没有被删除)。

DECLARE @dbname nvarchar(128)
SET @dbname = 'Development'

IF(EXISTS(SELECT NULL FROM sys.databases 
          WHERE ('[' + name + ']' = @dbname OR name = @dbname )))   
BEGIN
    DECLARE @sql VARCHAR(MAX)
    SELECT @sql = COALESCE(@sql,'') + 'Kill ' + Convert(varchar, SPId) + ';'
    FROM MASTER..SysProcesses
    WHERE DBId = DB_ID(@dbname) AND SPId <> @@SPId

    EXEC(@sql)

    EXEC('DROP DATABASE ' + @dbname);

    PRINT 'Existing database removed'
END
ELSE 
BEGIN
    PRINT 'Database not present';
END

我得到的结果是打印 'Database not present' 并且没有删除数据库。 我想要的是已删除的数据库(.mdf.ldf

执行查询的用户可能没有查看数据库的权限。

If the caller of sys.databases is not the owner of the database and the database is not master or tempdb, the minimum permissions required to see the corresponding row are ALTER ANY DATABASE or the VIEW ANY DATABASE server-level permission, or CREATE DATABASE permission in the master database. The database to which the caller is connected can always be viewed in sys.databases.

取自https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-databases-transact-sql?view=sql-server-2017

在 SSMS 中尝试 运行 下面的查询来检查您是否可以看到您的数据库。

SELECT * FROM sys.databases 

数据库 没有逻辑名称 "development"。它包含的文件之一具有该逻辑名称。

获取逻辑文件名对应的数据库名可以使用

SELECT DB_NAME(database_id)
FROM sys.master_files
WHERE name = 'Development'

然后将其分配给 @dbname - 可能有多个结果。不能保证逻辑文件名在数据库中是唯一的