Разрешение на выполнение Sql-сервера; неприменение разрешений
Я только что перешел с SQL2000 на SQL2008 и начал получать разрешение на выполнение для хранимого процесса, который использует sp_OACreate.
Остальная часть системы работает нормально с логином db, который был настроен и добавлен в базу данных.
Я пробовал:
USE master
GO
GRANT EXEC ON sp_OACreate TO [dbuser]
GO
Но это терпит неудачу со следующей ошибкой:
Сообщение 15151, уровень 16, состояние 1, строка 1 Не удается найти пользователя "dbuser", так как он не существует или у вас нет разрешения.
Я вошел на сервер как sa с полными разрешениями. Я могу выполнить аналогичный SQL-оператор и применить разрешения для роли сервера, но не для входа в систему / пользователя.
Как применить изменения к конкретному пользователю / логину?
Я могу применить разрешения к публичной роли, и это решает мою проблему; однако, мне кажется, это проблема безопасности, которую я не хочу применять к работающему серверу.
5 ответов
Исходя из ответа Джона, я проверил списки пользователей в базе данных Master, а моего пользователя там не было. Был ли он удален или потерян, как я не знаю. Возможно, что-то сошло с ума при переносе dbs на новый экземпляр сервера.
Тем не мение; воссоздание пользователя и привязка его к конкретному имени входа позволили мне выполнить следующие операторы в основной базе данных, чтобы разрешить выполнение хранимых процедур.
USE MASTER
GO
GRANT EXECUTE ON [sys].[sp_OADestroy] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OACreate] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [dbuser]
GO
Спасибо за всю помощь и указатели. Надеюсь, что это поможет другим людям в будущем.
Ошибка предполагает, что пользователь "dbuser" не существует в базе данных master.
Я предполагаю, что пользователь существует в базе данных master?
Вы можете проверить с помощью следующего T-SQL
USE MASTER;
GO
SELECT *
FROM sys.sysusers
WHERE name = 'dbuser'
Если пользователь оказывается не существует, просто используйте оператор CREATE USER и создайте пользователя с именем "dbuser". Пользователь будет автоматически сопоставлен с логином с тем же именем, если он существует.
Ваша проблема может быть связана с осиротевшими пользователями.
Пытаться
USE MASTER
GO
EXEC sp_change_users_login 'Report'
Это вернет одну строку для каждого осиротевшего имени пользователя. Затем,
EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser'
Вот некоторый код, который я использую для проверки того, что (текущий пользователь) имеет разрешение EXECUTE для sp_OACreate и т. Д.:
use master;
select state_desc,name from
sys.database_permissions a
left join
sys.all_objects b
on a.major_id = b.object_id
where name like 'sp_OA%';
Как указывают @John Sansom и @WestDiscGolf, пользователь должен существовать в базе данных Master, а права на исполнение должны предоставляться в базе данных Master, следовательно use Master
необходимо. Запрос выше вернет записи, если у пользователя есть разрешения на выполнение, и пустое множество, если они этого не делают. (Выполнение в пользовательской базе данных также вернет пустой набор.)
Я не мог найти способ проверить эти разрешения с помощью fn_my_permissions
, который, якобы, является правильным инструментом для таких работ.
Проверьте, есть ли у вашего пользователя разрешения на используемую вами базу данных. Вы можете сделать это Security -> Logins -> Select User
и откройте окно свойств. Затем выберите "User Mapping"
из правого меню. Теперь проверьте базы данных, к которым у данного пользователя должен быть доступ. После этого выберите в нижней части окна "Членство в роли базы данных" и проверьте "db_owner"
, Теперь пользователь будет владельцем базы данных и сможет выполнять запросы, хранить процедуры и так далее.
ОБНОВИТЬ:
Добавьте пользователя в базу данных, выбрав базу данных -> безопасность -> пользователи -> щелкните правой кнопкой мыши "New User"
Или вы можете использовать этот запрос
CREATE LOGIN AbolrousHazem
WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';
USE AdventureWorks2008R2;
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;
GO
Вот более подробная информация http://msdn.microsoft.com/en-us/library/ms173463.aspx