6

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

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

Я пробовал:

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

Но это не удается из-за ошибки:

Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbuser', because it does not exist or you do not have permission.

Я вошел на сервер, как са с полными правами доступа. Я могу выполнить аналогичный оператор 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 

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

+0

Как вы перенесли свои базы данных? Если вы не восстановили основную базу данных, тогда пользовательский «dbuser» не присутствовал бы и, следовательно, не отображался. –

+0

@John - Вы правы. Восстановление базы данных Master не было выполнено из-за некоторых исторических плохих бит и бобов, от которых мы хотели уйти от миграции. К сожалению, мы также потеряли пользователей, которые теперь заново созданы и сопоставлены с входами :-) – WestDiscGolf

1

Проверьте, есть ли у пользователя разрешения для используемой базы данных. Вы можете сделать это на Security -> Logins -> Select User и открыть окно свойств. Затем выберите "User Mapping" в правом меню. Теперь проверьте базы данных, к которым вы хотите, чтобы данный пользователь имел доступ. После этого выберите из нижней части окна «Членство в роли базы данных» и отметьте "db_owner". Теперь пользователь будет владельцем базы данных и сможет выполнять запросы, хранить процедуры и так далее.

UPDATE:
Добавить пользователя в базе данных путем выбора базы данных -> Безопасность -> Пользователи -> правой кнопкой мыши "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

+0

Спасибо за ваш ответ. Роль db_owner для пользователя устанавливается в базе данных. Я попытался добавить конкретные права выполнения к роли db_owner, и я получаю следующее сообщение об ошибке «Невозможно предоставить, запретить или отменить разрешения для или из специальных ролей». – WestDiscGolf

+0

Проверьте, есть ли у вас пользователь, подключенный к вашей базе данных. Кажется, что у вас есть только логин, но не пользователь. – Thea

+0

похоже, что это так; Я добавил ответ на вопрос, что я сделал для решения проблемы. Спасибо за помощь :-) – WestDiscGolf

2

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

Попробуйте

USE MASTER 
GO 
EXEC sp_change_users_login 'Report' 

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

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser' 
+0

Спасибо за ваш ответ. Я запустил первую команду на сервере, и никакие записи не возвращаются запросом. – WestDiscGolf

+0

Спасибо за точку в помощи в правильном направлении. +1 :-) – WestDiscGolf

4

Ошибка указывает на то, что пользовательский «dbuser» не существует в основной базе данных.

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

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

USE MASTER; 
GO 

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

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

+0

Спасибо за ваш ответ. Нет, нет в таблице sysusers. Как его можно добавить? – WestDiscGolf

+0

Хорошо, добавив пользователя и связав его с логином dbuser. Затем я применил разрешения доступа к пользователю. :-) – WestDiscGolf

+0

@WestDiscGolf: Отличная новость, рада помочь. –

2

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

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

Смежные вопросы