Разрешить роли приложения выполнять DBCC CHECKDB
Мое (C#) приложение запускается, подключаясь к базе данных сервера SQL с ролью приложения.
Тем не менее, мне нужно, чтобы запустить DBCC CHECKDB
, но я получаю исключение:
Пользователь "MyAppRole" не имеет разрешения на запуск проверки DBCC для базы данных "MyDatabase".
Я обнаружил, что для запуска этой команды я не могу просто дать разрешение роли приложения для выполнения этого действия, мне нужно быть членом db_owner
роль.
Вещи, которые я пробовал:
1. В SQL Management Studio установите флажок db_owner в свойствах MyAppRole для этой базы данных. Однако я получаю то же исключение.
2: Добавить роль db_owner.
exec sp_addrolemember 'db_owner', 'MyAppRole'
Но теперь, когда я запускаю приложение, я получаю это исключение в момент выполнения DBCC CHECKDB:
Участник сервера "MYDOMAIN\MyWindowsUsername" не может получить доступ к базе данных "MyDatabase" в текущем контексте безопасности.
что особенно сбивает с толку, потому что в SQL Managment Studio я могу легко запустить команду после входа в систему с использованием проверки подлинности Windows.
3: создание хранимой процедуры с исполнением от имени владельца
CREATE PROCEDURE sp_dbcccheck WITH EXECUTE AS OWNER
AS
BEGIN
DBCC CHECKDB (MyDatabase) WITH TABLERESULTS
END
GO
... и учитывая мой MyAppRole
оформить разрешение. Но я все еще получаю исключение:
Участник сервера "MYDOMAIN\MyWindowsUsername" не может получить доступ к базе данных "MyDatabase" в текущем контексте безопасности.
... который я также получаю, если пытаюсь выполнить эту хранимую процедуру из SQL Management Studio.
4: Дайте роли приложения "КОНТРОЛЬ" разрешение (некоторые из них, казалось бы, противоречат цели роли приложения, но, в любом случае, цепляются за соломинку)
GRANT CONTROL ON DATABASE::MyDatabase TO MyAppRole
но это приводит к исходной ошибке, когда приложение пытается выполнить проверку.
Пользователь 'MyAppRole' не имеет разрешения на запуск проверки DBCC для базы данных 'MyDatabase'
Как правильно дать разрешение моей роли приложения на эту проверку?
2 ответа
Я не SQL Server
Специалист DBA, но я публикую свой опыт.
Согласно документам DBCC CHECKDB
Комнад требует sysadmin
фиксированная роль сервера или db_owner
фиксированная роль базы данных. Поскольку роль приложения не может быть членом sysadmin
Роль мы можем рассмотреть только по второму варианту.
Мы хотим работать с текущей базой данных, поэтому нам не нужны разрешения на уровне сервера, а разрешений на уровне базы данных должно быть достаточно. таким образом db_owner
членство должно сработать, и оно отлично работает для пользователя базы данных, но по какой-то причине не работает для роли приложения.
Я пытался добавить все другие роли БД для роли приложения, проверил сопоставления пользователей, которые выглядели хорошо, даже пытался выполнить DBCC TRACEON (4616, -1);
это упомянуто здесь, но это также не помогло, сервер продолжал выдавать ошибку из вашего второго абзаца.
Мне удалось заставить его работать только включив guest
Пользователь для текущей БД, но это нарушает представление о роли приложения.
Я сделал вывод (не уверен, что это правильно), что это невозможно, и использовал регулярно db role
а также db users
вместо
Из MSDN
Требуется членство в предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner.
Проблема, возникшая в результате шага 1, может быть связана с тем, что пользователь windows не сопоставлен с базой данных, к которой вы подключаетесь.