помогите разобраться в правах!

rigid_joke
Дата: 23.01.2013 11:01:33
sql server 2008 r2 (10.50.1600)

есть ресторенная база как temp_bud
есть пользователь другой базы (bud) , с правами на базу bud - dbo_owner. в базе temp_bud его нет!
входит в стандартную серверную роль public
есть пользователь select_admin , который входит в серверную роль sysadmin и не привязанный ни к одной из баз

пытаюсь из базы bud сделать вот такой вызов под пользователем select_admin

exec ('select * from [temp_bud].dbo.Topsheet') as login = 'select_admin'


в ответ получаю:
Msg 15406, Level 16, State 1, Line 1
Cannot execute as the server principal because the principal "select_admin" does not exist, this type of principal cannot be impersonated, or you do not have permission.

я что-то не так делаю или просто из-за того, что у моего пользователя под которым я выполняю строку меньше прав чем у select_admin?
pkarklin
Дата: 23.01.2013 11:11:40
Ну, как бы объяснено, в чем проблема:

this type of principal cannot be impersonated, or you do not have permission

Вы бы лучше задачу огласили. Скорее всего без смены контекста можно обойтись.
rigid_joke
Дата: 23.01.2013 11:16:47
pkarklin
Ну, как бы объяснено, в чем проблема:

this type of principal cannot be impersonated, or you do not have permission

Вы бы лучше задачу огласили. Скорее всего без смены контекста можно обойтись.


как бы да, но были сомнения!))

задача заключается в том, чтобы сделать select из ,востановленного бэкапа в пустую созданную базу без пользователей в ней , и при этом не давать первичному пользователю роль sysadmin!

для этого был заведен другой пользователь с ролью sysadmin и была попытка сделать запрос из восстановленной базы от имени этого пользователя, находясь при этом в роли обычного пользователя
задача пока терпит фиаско))

так чот если есть какой-то вариант, подходящий под задачу, буду вам очень признателен!!
pkarklin
Дата: 23.01.2013 11:20:25
rigid_joke
так чот если есть какой-то вариант, подходящий под задачу, буду вам очень признателен!!


Если владельцами обеих баз будут одни и теже логины (sa, например). В бд temp_bud пользователью Guеst будет разрешен коннект и у баз будет разрешено DB_CHAINING, то никаких доп. логинов создавать ненадо.
rigid_joke
Дата: 23.01.2013 11:27:02
pkarklin
rigid_joke
так чот если есть какой-то вариант, подходящий под задачу, буду вам очень признателен!!


Если владельцами обеих баз будут одни и теже логины (sa, например). В бд temp_bud пользователью Guеst будет разрешен коннект и у баз будет разрешено DB_CHAINING, то никаких доп. логинов создавать ненадо.


что-то я не очень понял или вы меня не очень поняли

у меня в базе temp_bud нет никаких логинов (считайте что пустая база)! восстанавливал базу как новую под логином пользователя у которого в системной роли есть кроме public еще и dbcreator

если вы имеете ввиду вот так:
exec ('select * from [temp_bud].dbo.Topsheet') as login = 'sa'

то могу сказать что пишет тоже самое что и в первом примере!
rigid_joke
Дата: 23.01.2013 11:29:39
или вы имели ввиду что можно программным способом из-под обычного пользователя базы bud с системной ролью public и не завязанного на temp_bud
дать какие-то полномочию, которые разрешат сделать запрос?
Glory
Дата: 23.01.2013 11:31:54
rigid_joke
у меня в базе temp_bud нет никаких логинов (считайте что пустая база)!

Начем с того, что логинов вообще нет в базах
Логины находятся на сервере. А в базах находятся пользователи.
Вы учитываете это при написании exec () as ?

rigid_joke
то могу сказать что пишет тоже самое что и в первом примере!

Разумеется.
А вы хотели, чтобы вот так просто любой ВасяПупкин смог "прикидываться" администратором ?
Для чего тогда нужна была бы вся система безопасности ?
pkarklin
Дата: 23.01.2013 11:47:07
rigid_joke
что-то я не очень понял


Читаем про Ownership Chains в документации. Я написал условия, необходимые для ее работы между бд. Приэтом никакой имперсонации EXEC ... AS ... делать не надо.
rigid_joke
Дата: 23.01.2013 11:51:27
Glory
rigid_joke
у меня в базе temp_bud нет никаких логинов (считайте что пустая база)!

Начем с того, что логинов вообще нет в базах
Логины находятся на сервере. А в базах находятся пользователи.
Вы учитываете это при написании exec () as ?

rigid_joke
то могу сказать что пишет тоже самое что и в первом примере!

Разумеется.
А вы хотели, чтобы вот так просто любой ВасяПупкин смог "прикидываться" администратором ?
Для чего тогда нужна была бы вся система безопасности ?


понятное дело, что логины находятся на сервере, я просто некорректно выразился и только потому что в моем примере видно, что я пытаюсь сделать as login , а не as user !

про Ownership Chains я сейчас почитаю в любом случае! но если в вашем случае не много текста и вам не сложно написать или скинуть, как образец, свой пример, то буду вам благодарен!
pkarklin
Дата: 23.01.2013 11:55:23
rigid_joke
свой пример


При выполнении условий, который я огласил ранее, Ваш запрос будет выглядеть просто:

select * from [temp_bud].dbo.Topsheet