powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_addrolemember
9 сообщений из 9, страница 1 из 1
sp_addrolemember
    #32063851
doctor_no
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемая группа, есть такой вопрос:
требуется создать процедуру которая динамически добавляет пользователя к роли при обращении к ней.
-- создаём от имени dbo
create procedure dbo.myProc
-- делаем проверку прав и назначаем роль
exec sp_addrolemember 'somerole' 'someusers'
но при выполнении возникает ошибка что у пользователя недостаточно прав на добавления пользователя к роли.

Как такое может быть если мы процедура запускается от имени создателя (dbo)? Или я не прав?

Заранее благодарен за любую информацию по этому поводу или вообще о использовании ролей в процедурах

-- doctor_no
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063903
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в BOL написано...Only members of the sysadmin fixed server role and the db_owner fixed database role can execute sp_addrolemember to add a member to fixed database roles. Role owners can execute sp_addrolemember to add a member to any SQL Server role they own. Members of the db_securityadmin fixed database role can add users to any user-defined role.
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063906
Фотография KANDed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых:
Is the security account being added to the role. security_account is sysname, with no default. security_account can be any valid SQL Server user, SQL Server role, or any Microsoft Windows NT® user or group granted access to the current database . When adding Windows NT users or groups, specify the name that the Windows NT user or group is known by in the database ( added using sp_grantdbaccess ).
Во-вторых: Fima опередил :(
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063916
doctor_no
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да но процедура создана от dbo и по сему должна иметь права на sp_addrolemember. Tак?
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063919
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так то оно так, но если вы посмотрите на текст этой процедуры, то увидите там проверку с помощью функции is_member() текущего пользователя на принадлежность к жестко заданным ролям.
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063920
misgan2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня все работает. Только что проверил.
...
Рейтинг: 0 / 0
sp_addrolemember
    #32063922
mishgan2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так - правильно говорит Glory.
...
Рейтинг: 0 / 0
sp_addrolemember
    #32064092
doctor_no
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так получается что я должен быть уже в роли чтобы её себе назначить? Это как?
Может быть роль которую я создал нужно было создать с
Код: plaintext
WITH GRANT OPTION

и is_member() обращается к роли?
...
Рейтинг: 0 / 0
sp_addrolemember
    #32064254
mishgan2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В коде этой процедуры есть такая проверка (взято с сервера 7.0):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE PROCEDURE sp_addrolemember
	@rolename       sysname,
	@membername     sysname
AS
     -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
 
	set nocount on
	declare @roluid     smallint,
            @owner      smallint,
            @memuid     smallint,
            @ret        int
    declare @ruidbyte   smallint,
            @ruidbit    smallint
	declare @proc		nvarchar( 50 )

     -- DISALLOW USER TRANSACTION --
 
	set implicit_transactions off
	if (@@trancount >  0 )
	begin
		raiserror( 15002 ,- 1 ,- 1 ,'sp_addrolemember')
		return ( 1 )
	end

     -- ROLE NAME (OBTAIN OWNER FOR PERMISSIONS) --
 
    select @roluid = uid, @owner = altuid from sysusers
                where name = @rolename and issqlrole =  1 

     -- ERROR IF ROLE NOT FOUND OR PUBLIC --
 
    if @roluid is null or @rolename = 'public'
    begin
	    raiserror( 15014 ,- 1 ,- 1 ,@rolename)
	    return ( 1 )
    end

     -- CHECK PERMISSIONS --
 
	 -- Only member of db_owner can add members to db-fixed roles --
 
    if (not is_member('db_owner') =  1 ) and
       (not (@roluid <  16400  and is_member('db_owner') =  1 )) and
       (not (@roluid >=  16400  and is_member('db_securityadmin') =  1 )) and
       (not (@roluid >=  16400  and is_member(user_name(@owner)) =  1 ))
    begin
		raiserror( 15000 ,- 1 ,- 1 )
		return ( 1 )
	end

Поэтому без разницы под кем создана процедура myProc, важно, чтобы пользователь, который ее запустил на выполнение входил в указанные роли.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_addrolemember
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]