Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Что нужно чтобы можно было держать процедуры в одной базе и выбирать данные из таблиц в другой?
Задача как можно меньше менять базу с таблицами, в идеале ничего не менять в ней.
Влоб попробовал создать логин, его пользователя в базе с процедурами и дать ему права на Execute, но вылезла ошибка:

The server principal "abc" is not able to access the database "abc" under the current security context.

Мне бы не хотелось даже пользователя для него создавать в той базе с таблицами.
25 сен 13, 00:11    [14880186]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
В принципе понятно почему получена ошибка выше.
Перекомпилировал процедуры под sa.
Теперь лезет The SELECT permission was denied on the object ... database 'abc' schema 'dbo'
Мне казалось что процедуры должны были унаследовать доступ sa и не требовать отдельных грантов на таблицы для исполняющего пользователя.
25 сен 13, 00:20    [14880195]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
1. Сделать sa владельцем обеих баз.
2. Включить на базе с процедурой TRUSTWORTHY.
25 сен 13, 03:20    [14880300]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
И логинить приложения тоже как sa?
25 сен 13, 04:48    [14880312]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Crimzic
Member

Откуда: Sydney
Сообщений: 59
Gobzo Kobler
И логинить приложения тоже как sa?

В дополнение к сказанному Ennor Tiegael в процедуру нужно добавить
WITH EXECUTE AS OWNER
Тогда, если owner = SA, исполнять процедуру можно будет любым пользователем имеющем EXECUTE permission.
Почитайте вот эту статью, в ней есть немного о cross database access, в т.ч. другие варианты реализации нужной вам функциональности:
http://www.sommarskog.se/grantperm.html
25 сен 13, 06:37    [14880339]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
ownership chaining
Guest
1. пользователя, который вызывает процедуру, нужно добавить в обе базы
2. проверить чтобы у процедуры и таблиц был один владелец
3. включить TRUSTWORTHY на базе c процедурой или cross db ownership chaining на уровне сервера.
25 сен 13, 09:54    [14880701]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
ownership chaining
Guest
а лучше почитать документацию, чтобы понимать как это работает
http://technet.microsoft.com/en-us/library/ms188676.aspx
25 сен 13, 09:57    [14880725]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
ownership chaining,

Если владелец обеих баз sa, на базе с процедурой стоит trustworthy, а сама процедура создана с кляузой with execute as owner, то добавлять пользователя в обе БД не требуется.

ТС написал "Перекомпилировал процедуры под sa", что я понял как добавление смены контекста. Но правильнее, конечно, execute as owner.
25 сен 13, 12:03    [14881550]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
ownership chaining
Guest
Ennor Tiegael
ownership chaining,

Если владелец обеих баз sa, на базе с процедурой стоит trustworthy, а сама процедура создана с кляузой with execute as owner, то добавлять пользователя в обе БД не требуется.

ТС написал "Перекомпилировал процедуры под sa", что я понял как добавление смены контекста. Но правильнее, конечно, execute as owner.

Имхо, "кошернее", ч/з стандартный механизм ownership chaining. Ибо появление нескольких владельцев + execute as owner с ownerом = sa, может привести к завышенным правам.


а "добавление смены контекста" ТС-ом, насколько я понял, не было самоцелью а лишь попыткой решить проблемы.
25 сен 13, 12:14    [14881611]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
ownership chaining,

Нет тут никакого завышения прав. Процедура делает ровно то, что в нее заложено. Если у юзера есть на нее грант, значит ему доверяют ровно настолько, насколько нужно для данного действия. А любой шаг вправо-влево в этой цепочке приведет к ее разрыву (не уверен за TRUSTWORTHY, правда).

А вот администрировать юзеров, когда они добавляются, а самое главное - удаляются ежедневно, по всем используемым БД - гораздо геморройнее. Нельзя просто так захардкодить имена баз в хранимку, допустим - они могут изменяться, они могут иметь разные имена в тесте и в продакшне, в зависимости от изменения полномочий пользователя добавлять/удалять его юзеров в _некоторых_ базах - нунафиг.
25 сен 13, 12:24    [14881663]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
ownership chaining
Guest
Ennor Tiegael
ownership chaining,

Нет тут никакого завышения прав. Процедура делает ровно то, что в нее заложено. Если у юзера есть на нее грант, значит ему доверяют ровно настолько, насколько нужно для данного действия. А любой шаг вправо-влево в этой цепочке приведет к ее разрыву (не уверен за TRUSTWORTHY, правда).



если в базе(базах) у всех объектов один владелец (например sa) то разницы нет, но если владельцы разные, то по феншую, один из владельцев не должен управлять правами(знать о принципах раздачи прав) объектов других владельцев.

фактически это и есть главная идеология доступов в mssql начиная с 2005 версии и достигается она разрывом цепочки владения при переходе к объекту другого владельца.


а with execute as owner, это что-то вроде костыля для обратной совместимости с mssql 2000
25 сен 13, 12:41    [14881776]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
ownership chaining,

Обратная совместимость - это как раз сохранение такого атрибута, как владелец базы. Я не могу придумать ни одного реального случая, когда имело бы смысл делать базы с разными владельцами в пределах одного инстанса. Раньше был низкобюджетный хостинг, и то не факт. Сейчас же, с виртуалками и облаками, и это ушло в прошлое.
25 сен 13, 14:55    [14882871]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
ownership chaining
Guest
Ennor Tiegael
ownership chaining,

Обратная совместимость - это как раз сохранение такого атрибута, как владелец базы. Я не могу придумать ни одного реального случая, когда имело бы смысл делать базы с разными владельцами в пределах одного инстанса. Раньше был низкобюджетный хостинг, и то не факт. Сейчас же, с виртуалками и облаками, и это ушло в прошлое.

при чем здесь владельцы баз? я говорю про владельцев объектов.
25 сен 13, 15:32    [14883197]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Ennor Tiegael
ownership chaining,

Если владелец обеих баз sa, на базе с процедурой стоит trustworthy, а сама процедура создана с кляузой with execute as owner, то добавлять пользователя в обе БД не требуется.

ТС написал "Перекомпилировал процедуры под sa", что я понял как добавление смены контекста. Но правильнее, конечно, execute as owner.


Да, все правильно, так все работает. Базами и так владеет sa (по крайней мере старой, в которую нам придется ходить, а новую мы создадим под sa). Спасибо большое!
25 сен 13, 17:28    [14883957]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
o-o
Guest
какая интересная тема выпадает в поиске,
если хочется почитать про TRUSTWORTHY.

Ennor Tiegael
ownership chaining,

Нет тут никакого завышения прав. Процедура делает ровно то, что в нее заложено. Если у юзера есть на нее грант, значит ему доверяют ровно настолько, насколько нужно для данного действия. А любой шаг вправо-влево в этой цепочке приведет к ее разрыву (не уверен за TRUSTWORTHY, правда).



для исполнителя процедуры, может, и нет завышения прав,
но зато есть раздача админских прав всем db_owner-ам базы, на к-ую навесили TRUSTWORTHY.

самое удивительное, что сам процесс заполучения прав db_owner-ами такой базы расписан в статье,
ссылка на к-ую приведена выше в этом же топике:

If the database is owned by sa + If you make the database trustworthy, any person with db_owner rights can impersonate a server login with sysadmin rights just and do whatever he likes.

чего хотелось сказать-то.
хорошо топик завершается: ура, спасибо, sa + TRUSTWORTHY работает.
от имени db_owner-а базы с овнером-сисадмином, присоединяюсь:
ура, товарищи, давайте еще такие советы,
а вы, товарищи с правами уровня сервера,
вешайте, плиз, почаще, TRUSTWORTHY на базы с овнером-админом, нам этого весьма не хватает!
12 ноя 13, 18:49    [15117635]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
o-o
any person with db_owner rights
И много у вас таких? У меня на продакшне ни одного не было.

Я описал метод, который работает. Хотите резать права дальше - вперед, ищите способы. Ну а если лично вам лень эти права настраивать и вы всем подряд раздаете dbo в боевых базах, то не надо перекладывать с больной головы на здоровую.
13 ноя 13, 04:31    [15119051]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
o-o
Guest
Ennor Tiegael,
Вы вообще читаете, что написано?
я ни разу не администратор, а как раз овнер кучки баз.
никому права не режу, я их наоборот пытаюсь заполучить.
где работаю, о да, предпосылки имеются, у нас тут здоровая виндовая группа, все db_owner-ы.
а овнер баз -- доменная учетка, сисадмин.
и да, могу ее юзером себе во все базы отмапить, жалко только, что не включено TRUSTWORTHY.
а предупредить о последствиях тех, кто статьи не читает, -- что в этом плохого?
Ваша супер-фраза об абсолютном незавышении ничьих прав имеет большую оговорку,
не имею права ее озвучить?
и при чем тут вообще здоровье моей головы?
я, кажется, в Вашу сторону личные комменты такого рода не отпускаю...
13 ноя 13, 12:22    [15120571]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из таблиц в одной базе при помощи процедур в другой (2008R2)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
o-o,

Возможно, не спорю. Настолько глубоко я это не копал, т.к. dbo на продакшне обычно не допускаются. Даже ddl_admin не допускается, ибо не нужен.

Думаю, на самом деле должно взлететь, если просто сделать владельцем обеих баз один и тот же логин. Не думаю, что там права сисадмина так уж прям нужны.
13 ноя 13, 16:03    [15122647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить