powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
22 сообщений из 22, страница 1 из 1
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086710
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не отключить на время работы процедуры, а игнорировать, что-ли, я не знаю.
Чтобы "вокруг - суббота, а у меня - четверг", как в старом еврейском анекдоте?
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086729
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086764
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad, Нет :-(
Речь об этом: https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15
Есть ли возможность не выключать ее, а игнорировать, как будто бы ее вообще нет.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086769
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Самое простое - в RLS-функции проверять наличие временной таблицы с определенным именем.
Ну или да, подписать процедуру и в RLS-функции проверять наличие определенного сертификата в sys.user_token
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086884
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Все равно оно при Select эту функцию миллиард раз вызовет, причем нестед лупом :-(
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086901
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Можно еще через SESSION_CONTEXT
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086946
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Да, я понимаю. Сделать так, чтобы секьюрити фанкшн всегда выдавала 1 - просто.
Дело не в этом.
Дело в том, что она всё равно вызывается. Причем всегда нестед лупом с ограничиваемой таблицей. И это радикально меняет планы запросов, и вообще - жутко тормозит на сколь-нибудь значительных объемах. Ну, от 100 миллионов записей в таблице - точно.

Короче, очередная игрушка ниочем, типа InMemory OLTP.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40086969
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
invm, Да, я понимаю. Сделать так, чтобы секьюрити фанкшн всегда выдавала 1 - просто.
Дело не в этом.
Дело в том, что она всё равно вызывается. Причем всегда нестед лупом с ограничиваемой таблицей. И это радикально меняет планы запросов, и вообще - жутко тормозит на сколь-нибудь значительных объемах. Ну, от 100 миллионов записей в таблице - точно.

Короче, очередная игрушка ниочем, типа InMemory OLTP.


Просто некоторые не умеют думать ее готовить.

Тебе ж правильно предлагали - надо все - запустись под тем, кому доступно все.

...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087197
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

оно встраивается в план выполнения, пока RLS включена она всегда будет срабатывать на проверку не зависимо от твоих прав, хоть ты миллион раз sysadmin.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087226
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
aleks222,

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

Ну ты открыл америку. Никто не обещал "не будет срабатывать".
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087227
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
felix_ff
aleks222,

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

Ну ты открыл америку. Никто не обещал "не будет срабатывать".
Вы обещали: "запустись под тем, кому доступно все", в ответ на "Дело в том, что она всё равно вызывается. Причем всегда нестед лупом с ограничиваемой таблицей. И это радикально меняет планы запросов, и ..."
:-)
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087242
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
felix_ff
aleks222,

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

Ну ты открыл америку. Никто не обещал "не будет срабатывать".

Вопрос был, собственно в этом.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087453
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ээээ...

"Разрешение ALTER ANY SECURITY POLICY предназначено для пользователей с высоким уровнем привилегий (например, для администратора политик безопасности). Администратору политик безопасности не требуется разрешение SELECT для защищаемых политиками таблиц." Оригинал не смотрел, возмоно что очень корявый перевод...

или

"Темпоральные таблицы. Темпоральные таблицы совместимы с безопасностью на уровне строк. Тем не менее предикаты безопасности в текущей таблице не реплицируются автоматически в прежнюю таблицу. Чтобы применить политику безопасности для текущей и прежней таблиц, необходимо по отдельности добавить предикат безопасности в каждую таблицу." - выкачать колонки разово во временную таблицу и с ней работать. Правда тогда нахрена вообще использовать механизм....
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087472
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Правда тогда нахрена вообще использовать механизм....
Идея ТС, наверное, в том, что при обращении пользователей использовать механизм Row-Level Security, а для объёмных перерасчётов не использовать, и не нести соотв. накладных расходов.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087483
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
SIMPLicity_
Правда тогда нахрена вообще использовать механизм....
Идея ТС, наверное, в том, что при обращении пользователей использовать механизм Row-Level Security, а для объёмных перерасчётов не использовать, и не нести соотв. накладных расходов.

Идея Row-Level Security на многомиллионно-строчных таблицах может родится только в больном сознании.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087489
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

авторВопрос был, собственно в этом.

А как же повторяемость результата? Не может быть выключено в принципе, иначе нарушите этот принцип. Не тем путём пошли, видимо. Бизнес очень любит "частные решения", но в БД закон должен быть для всех един.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087560
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
alexeyvg
пропущено...
Идея ТС, наверное, в том, что при обращении пользователей использовать механизм Row-Level Security, а для объёмных перерасчётов не использовать, и не нести соотв. накладных расходов.

Идея Row-Level Security на многомиллионно-строчных таблицах может родится только в больном сознании.

Мне кажется, что Вы излишне категоричны. Возможно что при высоком уровне параллелелизма итоговый выигрыш "встроенного" решения может перекрыть затраты на "железо".
PS Я тоже с ним поигрался, но до реального применения,- в силу специфики работы, увы,- не дошло :( ...
А так чо,- есть типа такой механизм,- ну и норм. Ни чем не хуже "нативной" поддержки xml-я
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087586
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, это альтернатива настроенным по ролям представлениям или функциям, зависимым от пользователей. Извлечение данных из витрин операционных отчетов, "прозрачное" использование общей таблицы для персональных настроек и тому подобное.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087630
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Собственно, это альтернатива настроенным по ролям представлениям или функциям, зависимым от пользователей. Извлечение данных из витрин операционных отчетов, "прозрачное" использование общей таблицы для персональных настроек и тому подобное.

Зри в корень!

Это, тупо, возможность ввести разделение доступа в системах, где штатно это не предусмотрено.
Во всех прочих случаях - никто не мешает фильтровать самостоятельно.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087724
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
alexeyvg
пропущено...
Идея ТС, наверное, в том, что при обращении пользователей использовать механизм Row-Level Security, а для объёмных перерасчётов не использовать, и не нести соотв. накладных расходов.

Идея Row-Level Security на многомиллионно-строчных таблицах может родится только в больном сознании.

Ну, оно без особых проблем работает на миллиарде записей.
Таблицы, конечно, секционированы, и секьюрити фанкшн, конечно, построена с учетом исключения секций.
Засада начитается тогда, когда нужно посчитать оперативную статистику по всем таблицам.
Из-за того, что секьюрити фанкшн всегда соединяется с таблицей nested loop'ом, серверу не удается построить адекватный план.
И если без ров левел такие отчеты отрабатывают за пару минут, то с ней - за несколько часов.
Разумеется, из под записи с полными привилегиями.
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087731
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
aleks222
пропущено...

Идея Row-Level Security на многомиллионно-строчных таблицах может родится только в больном сознании.

Ну, оно без особых проблем работает на миллиарде записей.
Таблицы, конечно, секционированы, и секьюрити фанкшн, конечно, построена с учетом исключения секций.
Засада начитается тогда, когда нужно посчитать оперативную статистику по всем таблицам.
Из-за того, что секьюрити фанкшн всегда соединяется с таблицей nested loop'ом, серверу не удается построить адекватный план.
И если без ров левел такие отчеты отрабатывают за пару минут, то с ней - за несколько часов.
Разумеется, из под записи с полными привилегиями.


Что-то у вас концы с концами не сходятся:

>>Ну, оно без особых проблем работает на миллиарде записей.

>>И если без ров левел такие отчеты отрабатывают за пару минут, то с ней - за несколько часов.

Надо обуться на обе ноги...
...
Рейтинг: 0 / 0
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
    #40087747
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Из-за того, что секьюрити фанкшн всегда соединяется с таблицей nested loop'ом
Если есть NL - значит в RLS-функции идут обращения к таблицам и т.п.
NL можно убрать, обернув эти обращения в скалярную функцию.
Но даже без этого можно существенно ускорить псевдоотключением RLS
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

alter database scoped configuration set last_query_plan_stats = on;
go

create table dbo.t
(
 id int identity primary key,
 v int,
 rls_off__flag as case when object_id(N'tempdb..#t__stop_rls', 'U') is not null then 1 else 0 end
);
go

declare @c int = 1000000;

insert into dbo.t
 (v)
 select top (@c)
  rand(checksum(newid())) * 4096 + 1
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
go

create function dbo.fnTestNumber
(
 @n int
)
returns int
as
begin
 return case when exists(select 1 from master.dbo.spt_values where number = @n and type = 'A') then 1 else 0 end
end;
go

create function dbo.fnFilter
(
 @n bit,
 @rls_off__flag bit
)
returns table
as
return (
 select
  1 as dummy
 where
  exists(select 1 from master.dbo.spt_values where @rls_off__flag = 1 or (@rls_off__flag = 0 and number = @n and type = 'A'))
);
go

create security policy dbo.t__Filtering
add filter predicate dbo.fnFilter(v, rls_off__flag) on dbo.t
with (state = off, schemabinding = off);
go

declare @c int; select /*RLS off*/ @c = count(*) from dbo.t option (maxdop 1);
go

alter security policy dbo.t__Filtering with (state = on);
go

drop table if exists #t__stop_rls;
go
declare @c int; select /*RLS on, rls_off__flag = 0, subquery*/ @c = count(*) from dbo.t option (maxdop 1);
go

create table #t__stop_rls (dummy int);
go
declare @c int; select /*RLS on, rls_off__flag = 1, subquery*/ @c = count(*) from dbo.t option (maxdop 1);
go

alter function dbo.fnFilter
(
 @n bit,
 @rls_off__flag bit
)
returns table
as
return (
 select
  1 as dummy
 where
  @rls_off__flag = 1 or (@rls_off__flag = 0 and dbo.fnTestNumber(@n) = 1)
);
go

drop table if exists #t__stop_rls;
go
declare @c int; select /*RLS on, rls_off__flag = 0, scalar function*/ @c = count(*) from dbo.t option (maxdop 1);
go

create table #t__stop_rls (dummy int);
go
declare @c int; select /*RLS on, rls_off__flag = 1, scalar function*/ @c = count(*) from dbo.t option (maxdop 1);
go

with d as
(
 select
  a.descr
 from
  (
   values
    (N'RLS off'), (N'RLS on, rls_off__flag = 0, subquery'), (N'RLS on, rls_off__flag = 1, subquery'), (N'RLS on, rls_off__flag = 0, scalar function'), (N'RLS on, rls_off__flag = 1, scalar function')
  ) a(descr)
),
stat as
(
 select
  d.descr, qs.last_worker_time, qp.query_plan, aqp.query_plan as last_actual_query_plan,
  row_number() over (partition by d.descr order by qs.creation_time desc) as rn
 from
  sys.dm_exec_query_stats qs cross apply
  sys.dm_exec_query_plan(qs.plan_handle) qp cross apply
  sys.dm_exec_sql_text(qs.sql_handle) st join
  d on st.text like N'%/*' + d.descr + N'*/%' outer apply
  sys.dm_exec_query_plan_stats(qs.plan_handle) aqp
)
select
 descr, last_worker_time, query_plan, last_actual_query_plan
from
 stat
where
 rn = 1
order by
 last_worker_time;
go

drop security policy dbo.t__Filtering;
drop function dbo.fnTestNumber, dbo.fnFilter;
drop table dbo.t;
go


descrlast_worker_timeRLS off55381RLS on, rls_off__flag = 1, scalar function88058RLS on, rls_off__flag = 1, subquery174615RLS on, rls_off__flag = 0, subquery12005265RLS on, rls_off__flag = 0, scalar function13025128
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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