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

问题描述 投票:0回答:2

我创建了一个包含数据库逻辑名称的变量,如果在我的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

我得到的结果是打印'数据库不存在',并且不删除数据库。我想要的是一个删除的数据库(.mdf.ldf

sql-server localdb
2个回答
0
投票

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

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

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

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


0
投票

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

如果sys.databases的调用者不是数据库的所有者且数据库不是master或tempdb,则查看相应行所需的最小权限是ALTER ANY DATABASE或VIEW ANY DATABASE服务器级权限或CREATE DATABASE权限在master数据库中。始终可以在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 
© www.soinside.com 2019 - 2024. All rights reserved.