powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL сервер процедуры права
23 сообщений из 23, страница 1 из 1
SQL сервер процедуры права
    #40123642
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, всем,

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




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

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

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




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

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


На процедуру только GRANT EXECUTE
...
Рейтинг: 0 / 0
SQL сервер процедуры права
    #40123645
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин, если только на процедуру, то при вызове процедуры ошибка, что нет прав на таблицу tbTest
...
Рейтинг: 0 / 0
SQL сервер процедуры права
    #40123646
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 имеет соответствующие разрешения на объект.
...
Рейтинг: 0 / 0
SQL сервер процедуры права
    #40123647
ErMiValRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Challenger,

Да можно, тема называется Ownership chains . Конкретно то, что вам требуется - описано в примере по ссылке.
...
Рейтинг: 0 / 0
SQL сервер процедуры права
    #40123650
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL сервер процедуры права
    #40123651
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Challenger,

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

Критик
Challenger,

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

EXEC sp_EXECuteSQL @SQLSt...

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

EXEC sp_EXECuteSQL @SQLSt...

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

EXEC sp_EXECuteSQL @SQLSt...

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

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

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

Как это можно решить?
Что не так теперь?
...
Рейтинг: 0 / 0
SQL сервер процедуры права
    #40127576
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL сервер процедуры права
    #40127670
Challenger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, а почему не работает как указали выше с добавлением директивы
WITH EXECUTE AS OWNER

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

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

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


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

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

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


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