Приветствую. Ситуация следующая:
Есть сервер с несколькими БД. Необходимо реализовать возможность программного создания/изменения логинов и юзеров для одной из БД. Притом делать это будет один из пользователей, т.е. человек с ограниченными правами на одну из баз.
Написан простую процедурку, добавляющую или же меняющую пароль юзера. Вид у процедурки следующий:
ALTER PROCEDURE [dbo].[sp_AddUserForUploadData]
@ID int,
@Password varchar(10)
WITH EXECUTE AS 'CleverUser'
AS
DECLARE @Login varchar(60), @SQL varchar(2048)
SET @Login='dlc' + (SELECT Login FROM cl_List WHERE ID=@ID)
IF @Login is null
BEGIN
RAISERROR ('No Client found!', 16, 1)
RETURN
END
BEGIN TRY
BEGIN TRAN
IF DATABASE_PRINCIPAL_ID(@Login) Is Null
BEGIN
SET @SQL=
'CREATE LOGIN ' + @Login + '
WITH
PASSWORD = ''' + @Password + ''',
CHECK_POLICY = OFF,
DEFAULT_DATABASE = DLC'
EXEC (@Sql)
SET @Sql=
'CREATE USER ' + @Login + '
FOR LOGIN ' + @Login + '
WITH DEFAULT_SCHEMA = dbo'
EXEC (@Sql)
EXEC sp_AddRoleMember 'Stat_Add', @Login
UPDATE cl_List SET PrincipalID=DATABASE_PRINCIPAL_ID(@Login) WHERE ID=@ID
END
ELSE
BEGIN
SET @SQL=
'ALTER LOGIN ' + @Login + '
WITH
PASSWORD = ''' + @Password + ''''
EXEC (@Sql)
END
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
SELECT ERROR_MESSAGE()
END CATCH
Заранее хочу предупредить, что о возможной уязвимости в виде SQL Injection атаки я знаю, сейчас не в этом дело.
Как можно видеть, процедура должна отрабатывать от юзера ClearUser. Этого юзера я специально создал для изменения логинов. В нем то и есть вся проблема. У юзера проставлены следующие разрешения на уровне сервера: Alter Any Credential, Alter Any Login. На уровне базы - db_accessadmin, db_securityadmin.
Однако процедура не может ни создавать, ни изменять, ни удалять логины, аргументируя это отсутствием прав.
Собственно вопрос - какие еще ему нужно поставить права, чтобы все нормально работало?