Разрешение на выполнение Sql-сервера; неприменение разрешений - PullRequest
6 голосов
/ 15 июня 2010

Я только что перешел с SQL2000 на SQL2008 и начал получать разрешение на выполнение для хранимого процесса, который использует sp_OACreate.

Остальная часть системы работает нормально с логином db, который был настроен и добавлен в базу данных.

Я пробовал:

USE master
GO
GRANT EXEC ON sp_OACreate TO [dbuser]
GO

Но это не так из-за следующей ошибки:

Сообщение 15151, уровень 16, состояние 1, строка 1 Не могу найти пользователя 'dbuser', потому что его нет или у вас нет разрешение.

Я вошел на сервер как sa с полными разрешениями. Я могу выполнить аналогичный SQL-оператор и применить разрешения для роли сервера, но не для входа в систему / пользователя.

Как применить изменения к конкретному пользователю / логину?

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

Ответы [ 5 ]

5 голосов
/ 15 июня 2010

Исходя из ответа Джона, я проверил списки пользователей в базе данных 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

Спасибо за помощь и указатели. Надеюсь, что это поможет другим людям в будущем.

5 голосов
/ 15 июня 2010

Ошибка предполагает, что пользователь "dbuser" не существует в базе данных master.

Я полагаю, пользователь существует в базе данных master?

Вы можете проверить с помощью следующего T-SQL

USE MASTER;
GO

SELECT *
FROM sys.sysusers
WHERE name = 'dbuser'

Если пользователь оказывается не существующим, просто используйте оператор CREATE USER и создайте пользователя с именем "dbuser". Пользователь будет автоматически сопоставлен с логином с тем же именем, если он существует.

2 голосов
/ 30 ноября 2011

Вот некоторый код, который я использую для проверки того, что (текущий пользователь) имеет разрешение 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, который, предположительно, является подходящим инструментом для подобных задач.

2 голосов
/ 15 июня 2010

Ваша проблема может быть связана с потерянными пользователями.

Попробуйте

USE MASTER
GO
EXEC sp_change_users_login 'Report'

Это вернет одну строку для каждого потерянного имени пользователя.Тогда

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser'
1 голос
/ 15 июня 2010

Проверьте, есть ли у вашего пользователя разрешения на используемую вами базу данных.Вы можете сделать это с помощью 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

...