我创建了一个包含数据库逻辑名的变量,如果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
)
答案 0 :(得分:0)
执行查询的用户可能没有查看数据库的权限。
如果sys.databases的调用者不是数据库的所有者,并且 数据库不是master或tempdb,所需的最低权限 要查看相应的行是ALTER ANY DATABASE或VIEW ANY DATABASE服务器级权限,或CREATE DATABASE权限 主数据库。呼叫者连接到的数据库可以 总是在sys.databases中查看。
尝试在SSMS中运行以下查询,以检查是否可以看到数据库。
SELECT * FROM sys.databases
答案 1 :(得分:0)
数据库没有逻辑名称“ development”。它包含的文件之一具有该逻辑名称。
要获取与逻辑文件名相对应的数据库名称,您可以使用
SELECT DB_NAME(database_id)
FROM sys.master_files
WHERE name = 'Development'
然后将其分配给@dbname
-可能会有多个结果。无法保证逻辑文件名在数据库之间是唯一的