db_owner не может удалить базу данных - Ошибка 615, SQL Server


11

У меня база данных SQL Server 2012 работает на Amazon EC2. Я создал пользователя, чтобы иметь возможность создавать, редактировать и удалять базы данных. Я дал нового пользователя с dbcreatorролью сервера.

Мой пользователь может подключиться удаленно и успешно запускает create database foo;команду. Но когда пользователь пытается снова удалить базу данных с drop database foo;помощью команды, происходит сбой со следующей ошибкой:

Warning: Fatal error 615 occurred at Feb  1 2014  5:15PM.
   Note the error and time, and contact your system administrator.
ErrorCode: 21

Хотя выбранная база данных есть master(поэтому я не думаю, что это потому, что она используется). И команда успешно выполняется, когда я запускаю ее снова, вошел в систему как администратор.

Я проверил вновь созданную базу данных, и моему пользователю была назначена db_ownerроль в базе данных, как я и ожидал, поэтому я понимаю, что для этого пользователя должно быть достаточно разрешений для удаления базы данных, которую он только что создал.

введите описание изображения здесь

Согласно http://technet.microsoft.com/en-us/library/ms178613.aspx роли db_owner должно быть достаточно разрешений. «Требуется разрешение CONTROL для базы данных, или разрешение ALTER ANY DATABASE, или членство в предопределенной роли базы данных db_owner».

Я просмотрел ошибку 615 и обнаружил «Не удалось найти идентификатор таблицы базы данных% d, имя«%. * Ls ».» что не имеет смысла для меня. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Информация о версии сервера SQL: Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64) /n May 22 2013 17:10:44 /n Copyright (c) Microsoft Corporation/n Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)/n- с select @@version.

Ответы:


12

Я могу догадаться, у вас есть опция AutoClose для базы данных, установленная в True. Это поведение по умолчанию при создании базы данных в Express Editions.

Указанная ошибка может возникнуть именно в этом случае. На самом деле полное сообщение об ошибке 615 гласит: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Таким образом, он указывает, что база данных может быть закрыта во время удаления.

Итак, перейдите к свойствам БД, переключите его на False и попробуйте снова сбросить его или используйте приведенный ниже скрипт перед сбросом

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Многие отмечают, что для AutoClose лучше установить False. Я нашел эту статью, объясняющую немного больше об AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Небольшое расширение ответа:

-- this works in standard SQL Server Editions, but NOT with Express Editions:
CREATE DATABASE [MyDB]
GO
DROP DATABASE [MyDB]
GO

-- this works in ALL SQL Server Editions
CREATE DATABASE [MyDB]
GO
ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO
DROP DATABASE [MyDB]
GO

2

Конфигурация, которую вы описываете, должна быть в порядке.

Есть ли вероятность того, что вы на самом деле пытаетесь удалить базу данных от имени другого пользователя?

Я бы рекомендовал подключаться в качестве тестового пользователя с использованием SSMS, чтобы быть на 100% уверенным, что вы являетесь этим пользователем. Кроме того, перед удалением проверки базы данных вы можете получить доступ к некоторым данным из нее, возможно, также проверить, можете ли вы перевести ее в однопользовательский режим, который, я думаю, вам в конечном итоге придется делать в любом случае.


Я действительно пытался с SSMS непосредственно на сервере, устанавливая новое соединение с учетными данными этого пользователя. Тот же результат, что и удаленно. Я только что проверил, и пользователь действительно может создать таблицу, вставить строку и успешно прочитать ее обратно. Я дважды проверил правильного пользователя, который показывал перед выполнением запроса в ssms, и это было так, но после выполнения оператора drop он изменился на «не подключен». Я думаю, это только потому, что это фатальная ошибка, но я не заметил этого раньше.
Тим Абелл

2
@Tim: Да, ошибки уровня 20 и выше обрывают соединение, так что это всего лишь симптом. Дает ли журнал ошибок SQL Server или журнал событий приложений дополнительную информацию?
Джон Зигель

Боюсь, у меня не было возможности вернуться к этому, чтобы проверить, но спасибо за подсказку. Я проверю журналы в следующий раз, когда я изучу это (не уверен, когда это будет).
Тим Абелл

0

Я не нашел причину этого, но следующее, хотя и не лучшее решение, разрешает команду.

Я надеюсь, что это указывает на проблему, и кто-то может дать лучший ответ.

Я использую Microsoft SQL Server Management Studio (администратор).

Дважды щелкните пользователя, выберите роли сервера, укажите dbcreator, public и sysadm.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.