Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL сервер процедуры права / 23 сообщений из 23, страница 1 из 1
28.12.2021, 15:35
    #40123642
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Добрый день, всем,

Есть пользователь у которого есть права на вызов хранимых процедур.
Код: sql
1.
  GRANT EXECUTE ON procTest TO usrTest




В процедуре делается select по таблицам, например tbTest.

Можно ли дать права на select только хранимой процедуре, чтобы пользователь не мог явно вызвать select без вызова хранимой процедуры.
Как этот GRANT будет выглядеть, если это возможно?
...
Рейтинг: 0 / 0
28.12.2021, 15:41
    #40123643
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
Добрый день, всем,

Есть пользователь у которого есть права на вызов хранимых процедур.
Код: sql
1.
  GRANT EXECUTE ON procTest TO usrTest




В процедуре делается select по таблицам, например tbTest.

Можно ли дать права на select только хранимой процедуре, чтобы пользователь не мог явно вызвать select без вызова хранимой процедуры.
Как этот GRANT будет выглядеть, если это возможно?


На процедуру только GRANT EXECUTE
...
Рейтинг: 0 / 0
28.12.2021, 15:50
    #40123645
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Ролг Хупин, если только на процедуру, то при вызове процедуры ошибка, что нет прав на таблицу tbTest
...
Рейтинг: 0 / 0
28.12.2021, 16:00
    #40123646
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger,

у вас владелец модуля и таблицы должен совпадать, в таком случае вам не нужно явное право select на таблицу.

то есть:
к примеру у вас владелец таблицы user1
тогда вы должны создать процедуру этим пользователем user1
и тогда (user1/db_owner/dbo) может дать права execute на процедуру user2 у которого нет явного права select на таблицу.

user2 сможет выполнять процедуру и читать данные таблицы но только через созданную процедуру.

вот вам выдержка из документации:

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

Модуль помечен как EXECUTE AS USER или SELF, и владелец модуля обладает соответствующими разрешениями на данный объект. Дополнительные сведения об олицетворении в модуле см. в разделе Предложение EXECUTE AS (Transact-SQL).

Модуль помечен как EXECUTE AS CALLER, и есть соответствующие разрешения на данный объект.

Модуль помечен как EXECUTE AS user_name, а user_name имеет соответствующие разрешения на объект.
...
Рейтинг: 0 / 0
28.12.2021, 16:03
    #40123647
ErMiValRU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger,

Да можно, тема называется Ownership chains . Конкретно то, что вам требуется - описано в примере по ссылке.
...
Рейтинг: 0 / 0
28.12.2021, 16:13
    #40123650
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
felix_ff
Challenger,

у вас владелец модуля и таблицы должен совпадать, в таком случае вам не нужно явное право select на таблицу.

то есть:
к примеру у вас владелец таблицы user1
тогда вы должны создать процедуру этим пользователем user1
и тогда (user1/db_owner/dbo) может дать права execute на процедуру user2 у которого нет явного права select на таблицу.

user2 сможет выполнять процедуру и читать данные таблицы но только через созданную процедуру.

вот вам выдержка из документации:

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

Модуль помечен как EXECUTE AS USER или SELF, и владелец модуля обладает соответствующими разрешениями на данный объект. Дополнительные сведения об олицетворении в модуле см. в разделе Предложение EXECUTE AS (Transact-SQL).

Модуль помечен как EXECUTE AS CALLER, и есть соответствующие разрешения на данный объект.

Модуль помечен как EXECUTE AS user_name, а user_name имеет соответствующие разрешения на объект.


Владелец и процедуры и таблицы dbo, проверил, по видимому еще нюанс есть какой то, который я не понял.
...
Рейтинг: 0 / 0
28.12.2021, 16:13
    #40123651
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger,

Таблица, поди, в другой базе или на другом сервере?
...
Рейтинг: 0 / 0
28.12.2021, 19:45
    #40123701
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Критик, все на одном сервере
...
Рейтинг: 0 / 0
28.12.2021, 20:09
    #40123713
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
Критик, все на одном сервере

Критик
Challenger,

Таблица, поди, в другой базе или на другом сервере?
...
Рейтинг: 0 / 0
28.12.2021, 20:26
    #40123714
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
aleks222, в одной базе на одном сервере все. И хранимая процедура и таблица
...
Рейтинг: 0 / 0
28.12.2021, 20:59
    #40123720
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
в одной базе на одном сервере все. И хранимая процедура и таблица
Тогда утверждение "Владелец и процедуры и таблицы dbo, проверил" не соответствует действительности, ибо чудес не бывает.
Либо обращение к таблице через динамику.
...
Рейтинг: 0 / 0
28.12.2021, 20:59
    #40123721
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
по видимому еще нюанс есть какой то, который я не понял.
Может, делается динамический запрос?
...
Рейтинг: 0 / 0
28.12.2021, 21:24
    #40123725
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
alexeyvg, да динамический запрос

EXEC sp_EXECuteSQL @SQLSt...

Как в этом случае решается?
...
Рейтинг: 0 / 0
28.12.2021, 22:07
    #40123733
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
alexeyvg, да динамический запрос

EXEC sp_EXECuteSQL @SQLSt...

Как в этом случае решается?
Можно сделать процедуру-заглушку, в которой вызывать EXEC sp_EXECuteSQL @SQLSt...
А в определении процедуры написать WITH EXECUTE AS OWNER
...
Рейтинг: 0 / 0
28.12.2021, 22:08
    #40123735
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
alexeyvg
Challenger
alexeyvg, да динамический запрос

EXEC sp_EXECuteSQL @SQLSt...

Как в этом случае решается?
Можно сделать процедуру-заглушку, в которой вызывать EXEC sp_EXECuteSQL @SQLSt...
А в определении процедуры написать WITH EXECUTE AS OWNER
Собственно, не "процедуру-заглушку", а в определении вашей procTest надо написать WITH EXECUTE AS OWNER
...
Рейтинг: 0 / 0
18.01.2022, 17:01
    #40127507
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
alexeyvg, только сейчас вернулся после отпуска, а проблема осталась.
сделал так
в определении procTest написал WITH EXECUTE AS OWNER

При вызове процедуры теперь получаю сообщение

Невозможно выполнить в качестве участника базы данных, поскольку участник "dbo" не существует, этот тип участника не может проходить олицетворение, или отсутствует разрешение.

Как это можно решить?
Что не так теперь?
...
Рейтинг: 0 / 0
18.01.2022, 20:33
    #40127576
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
да динамический запрос

EXEC sp_EXECuteSQL @SQLSt...

Как в этом случае решается?
1. Создать сертификат
2. Создать юзера для этого сертификата
3. Дать этому юзеру разрешения на таблицы.
4. Подписать процедуру этим сертификатом.

Код: sql
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.
50.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create certificate cer1 encryption by password = '111111' with expiry_date = '30000101', subject = 'Test';
go

create user u1 for certificate cer1;
go

create table dbo.t1 (id int);
go

create procedure dbo.p1
as
begin
 exec('select * from dbo.t1');
end;
go

add signature to dbo.p1 by certificate cer1 with password = '111111';
go

create user u2 without login;
grant execute on dbo.p1 to u2;
go

execute as user = 'u2';
go
exec dbo.p1;
go
revert;
go

grant select on dbo.t1 to u1;
go

execute as user = 'u2';
go
exec dbo.p1;
go
revert;
go

drop procedure dbo.p1;
drop table dbo.t1;
drop user u2;
drop user u1;
drop certificate cer1;
go

...
Рейтинг: 0 / 0
19.01.2022, 09:45
    #40127670
Challenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
invm, а почему не работает как указали выше с добавлением директивы
WITH EXECUTE AS OWNER

Вы не подскажете?
...
Рейтинг: 0 / 0
19.01.2022, 14:01
    #40127778
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger,

динамический запрос не наследует смену контекста пользователя. Лучше вообще отказаться от использования динамических запросов, где это только возможно.
...
Рейтинг: 0 / 0
19.01.2022, 16:04
    #40127843
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Владислав Колосов
динамический запрос не наследует смену контекста пользователя.
Динамический запрос выполняется в контексте, указанном в execute as, по умолчанию - self.
...
Рейтинг: 0 / 0
19.01.2022, 16:07
    #40127844
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
Challenger
invm, а почему не работает как указали выше с добавлением директивы
WITH EXECUTE AS OWNER
Либо кривой владелец БД или процедуры, либо в процедуре есть обращения к внешним ресурсам, а у БД не включено trustworthy.

Не пользуйтесь без нужды WITH EXECUTE AS OWNER - это небезопасно.
Безопасный способ я вам показал.
...
Рейтинг: 0 / 0
19.01.2022, 18:52
    #40127905
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
invm
Владислав Колосов
динамический запрос не наследует смену контекста пользователя.
Динамический запрос выполняется в контексте, указанном в execute as, по умолчанию - self.


Да, действительно. Легко же проверить.
...
Рейтинг: 0 / 0
21.01.2022, 11:28
    #40128342
siloniv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL сервер процедуры права
invm, а почему не работает как указали выше с добавлением директивы
WITH EXECUTE AS OWNERЛибо кривой владелец БД или процедуры, либо в процедуре есть обращения к внешним ресурсам, а у БД не включено trustworthy.

Не пользуйтесь без нужды WITH EXECUTE AS OWNER - это небезопасно.
Безопасный способ я вам показал.[/quot]

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


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