Как удалить базу данных, если в SQL Server существует переменная с ее логическим именем? - PullRequest
0 голосов
/ 23 апреля 2019

Я создал переменную, содержащую логическое имя базы данных, и удалил ее, если она присутствует в моем LocalDB.

Проблема, с которой я сталкиваюсь в моем текущем коде, состоит в том, что он ищет только в физических именах существующих баз данных.

(У меня есть база данных с логическим названием «Разработка», которая не удаляется).

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 голосов
/ 24 апреля 2019

База данных не имеет логического имени "разработка".Один из содержащихся в нем файлов имеет это логическое имя.

Чтобы получить имя базы данных, соответствующее логическому имени файла, вы можете использовать

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

, а затем присвоить его @dbname - тамможет быть несколько результатов.Нет никакой гарантии, что логическое имя файла является уникальным для всех баз данных

0 голосов
/ 24 апреля 2019

Пользователь, выполняющий запрос, вероятно, не имеет прав доступа к базе данных.

Если вызывающий объект 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 
...