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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

или

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

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

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

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

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

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

Зри в корень!

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

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

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

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

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


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

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

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

Надо обуться на обе ноги...
...
Рейтинг: 0 / 0
02.08.2021, 09:48
    #40087747
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры?
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли как-нибудь отключить Row-Level Security внутри хранимой процедуры? / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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