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

时间:2019-04-23 16:13:08

标签: sql-server localdb

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

2 个答案:

答案 0 :(得分:0)

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

  

如果sys.databases的调用者不是数据库的所有者,并且   数据库不是master或tempdb,所需的最低权限   要查看相应的行是ALTER ANY DATABASE或VIEW ANY   DATABASE服务器级权限,或CREATE DATABASE权限   主数据库。呼叫者连接到的数据库可以   总是在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 

答案 1 :(得分:0)

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

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

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

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