sp_adduser и sp_addlogin от простого пользователя

Mifodix
Дата: 13.06.2011 02:27:57
Всем доброго времени!
Возникла следующая проблема:
Пользователю БД дано разрешение на выполнение хранимой процедуры, которая отвечает за регистрацию нового пользователя, т. е. она использует sp_addlogin и sp_adduser. Естественно, SQL Server ругается на отсутствие прав для выполнения этих процедур. Как исправить?
Пробовал создавать процедуру так:
CREATE procedure [dbo].[RegisterNewUser] @userName varchar(32), @userPass varchar(64) WITH EXECUTE AS OWNER
и так
CREATE procedure [dbo].[RegisterNewUser] @userName varchar(32), @userPass varchar(64) WITH EXECUTE AS 'dbo'
Всё без толку.
Разрешить выполнение процедур sp_addlogin и sp_adduser этому пользователю не могу, т. к.:
"Разрешения на серверные представления каталогов, системные хранимые процедуры или расширенные хранимые процедуры могут быть предоставлены только в том случае, если текущей является база данных master. (Microsoft SQL Server, ошибка: 4629)"
Заранее спасибо за помощь!
Knyazev Alexey
Дата: 13.06.2011 09:05:47
Mifodix
Дата: 13.06.2011 15:01:30
Спасибо за статью, но не выходит:
1. Если создать сертификат внутри моей базы, то невозможно создать логин с этим сертификатом (сертификат не виден)
2. Если создать сертификат в базе master, то можно создать логин с этим сертификатом, но вот подписать хранимую процедуру внутри моей базы этим сертификатом нельзя (он опять-таки не виден)

Как создать один сертификат и для моей базы, и для базы master?
Mifodix
Дата: 14.06.2011 17:10:37
Так и не выяснил как сделать один сертификат для двух баз. Более того, как я понял, в статье даются права хранимой процедуре только если юзер Demo зашёл под логином VirtualSecurityOfficer. Или я не прав?
DeColo®es
Дата: 14.06.2011 17:54:11
Mifodix
если юзер Demo зашёл под логином VirtualSecurityOfficer
Это как? ;)

Можно сделать один сертификат в базе мастер, дав логину, созданному на его основании, права sysadmin.
Но это не решит "проблему" того, что логины - это сущности уровня сервера и существуют в базе master, а пользователи - сущности уровня базы данных и существуют в конкретной БД.

Так что лучше разделить функционал.
Или дождаться SQL 2011, в котором этот вопрос решается использованием Contained Database
Mifodix
Дата: 14.06.2011 18:34:06
DeColo®es
Это как? ;)

Это я жутко ступил:) Извините.

DeColo®es
Можно сделать один сертификат в базе мастер, дав логину, созданному на его основании, права sysadmin.

Что это даст? Сейчас максимум что я могу, это сделать хранимую процедуру для создания логинов в базе master, но вызвать её от имени пользователя из своей базы я естественно не могу.
DeColo®es
Дата: 14.06.2011 18:55:45
sysadmin может все, в том числе создавать пользователей в любой базе.
Но опять же, права пользователей баз хранятся в базах, права на объекты в БД mster также хранятся в базе master.
Поэтому права на создание логинов придется выдавать логину (ну или пользователю БД master), на уровне сервера.
Mifodix
Дата: 16.06.2011 00:37:56
Всем спасибо за помощь! В итоге выбрал радикальное решение - отказался от использования ролевой модели MS Sql Server:)
П-Л
Дата: 16.06.2011 08:47:36
Мне это кажется крайне не разумным.
invm
Дата: 16.06.2011 09:59:47
Mifodix,

Скорее всего опрометчивое решение. Если не устраивает подписывание процедуры, то есть старый добрый вариант с промежуточной таблицей и джобом, создающим логины.

DeColo®es,

Мне кажется, что в вашей статье было бы неплохо заменить
set @sql = 'create login ['+@login+'] with password = '''+replace(@password, '''', '''''')+''''
на
set @sql = 'create login ' + quotename(@login) + ' with password = ' + quotename(@password, '''')
?