ПРАШАЊА И ОДГОВОРИ ЗА RLS

- RLS_ALL корисник
- Додавање корисници
- Отстранување корисници
- Совети и трикови
|
1. RLS_ALL корисник
RLS_ALL е специјален корисник на базата на податоци без никакво мапирање на серверски логини. Тоа значи дека не можете да се најавите во SQL Server со него.
Единствениот начин да се користи е со EXECUTE AS USER = 'RLS_ALL'
Има пристап до сите податоци кои се одделени со RLS функционалност.
Овој корисник се користи, на пример, за создавање агрегати на податоци кои припаѓаат на повеќе корисници.
На пример, извештај за вкупна продажба за сите вработени за една година, но секој вработен може да види само својата продажба.
За корисник од пантеон да може да користи EXECUTE AS USER = 'RLS_ALL', мора да има GRANT IMPERSONATE дозволи на RLS_ALL корисник.
Само корисниците во Пантеон треба да имаат GRANT IMPERSONATE дозволи.
Давањето на тие дозволи на вградени SQL Server (како SA, итн.) сметки обично не е потребно.
- Само корисниците на Пантеон можат да читаат податоци од RLS заштитени таблици
SA корисник (ако не е мапиран на PA корисник) нема пристап до заштитени податоци.
Секои RLS заштитени податоци можат да се читаат само од PA корисник со соодветни авторизации.
За да се користат надворешни врски до базата на податоци, врската до базата на податоци мора да се направи со PANTHEON корисник поврзан со корисник на базата на податоци.
2. Додавање корисници
Додавање корисници за пристап до други апликации на PANTHEON базата на податоци.
Можеме да додадеме корисник со PANTHEON:
Видете ги следните инструкции: Додавање корисник и Поставување авторизации за корисник.
За покомплексни поставувања, каде што сакаме да додадеме корисник на повеќе бази на податоци.
Додавање корисник и наплаќање авторизации без права. Поставуваме дозволи на корисникот со PANTHEON:
declare
@v_cUserId sysname =
#UserName#
, @p_lang_id varchar(2)
--
, @p_subject varchar(30) = NULL
--
, @p_user_id int = NULL
, @p_contact_id int = NULL
BEGIN
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
SET @p_user_id = (SELECT anUserId FROM [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId);
set @p_contact_id = NULL;
IF (@p_user_id IS NULL)
BEGIN
Exec ppa_user_create @v_cUserId, @v_cUserId, 1;
select @p_subject = P.acOurCompany, @p_lang_id = PS.acLocalization from tPA_SysParam P, tPA_SysParamSys PS;
SELECT @p_user_id = anUserId FROM [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
EXEC [dbo].[ppa_user_save]
@p_user_id = @p_user_id OUTPUT -- @p_user_id int OUTPUT
, @p_contact_id = @p_contact_id OUTPUT -- @p_contact_id int OUTPUT
, @p_user_name = @v_cUserId -- sysname
, @p_lang_id = @p_lang_id -- varchar(2)
, @p_active = 'T' -- char(1)
, @p_license_server = Null -- sysname = NULL
, @p_license_database = Null -- sysname = NULL
, @p_profile = Null -- varchar(10) = NULL
, @p_additpersonmark = Null -- varchar(100) = NULL
, @p_code = Null -- varchar(20)= NULL
, @p_pin = Null -- varchar(11) = NULL
, @p_foreigner = 'F'
--
, @p_subject = @p_subject -- varchar(30) = NULL
, @p_name = @v_cUserId -- varchar(30) = NULL
, @p_surName = @v_cUserId -- varchar(30) = NULL
;
exec [dbo].[ppa_security_insert] @p_user_id, False, False;--без авторизации
exec ppa_security_save @p_user_id, False, False;
print @p_user_id
exec [dbo].[ppa_authorization_security_save]
NULL -- @p_authorization varchar(50)
, @p_user_id -- @p_principal_id int
, 0 -- @p_principal_type bit
, NULL -- @p_parent_id varchar(50)
, 0 -- @p_acquired bit
, 0 -- @p_inherited bit
, 0 -- @p_permission_select bit
, 0 -- @p_permission_update bit
, 0 -- @p_permission_delete bit
, 32767 -- @p_permission_update_period int
, 1 -- @p_propagate_entities bit = 0
, Null -- @p_licence char(2) = 'MF'
exec pPA_SysSQLLoginPswdChange @v_cUserId, Null, @v_cUserId;
EXEC sp_addrolemember N'db_owner', @v_cUserId;
EXEC sp_addrolemember N'db_datawriter', @v_cUserId;
EXEC sp_addrolemember N'db_datareader', @v_cUserId;
end;
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
select * from tPA_SetDoctypeUserSecurity where anUserId = @p_user_id;
end;
3. Отстранување корисници
declare
@v_cUserId sysname = #USER#,
@command nvarchar(max);
begin
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
delete from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
IF (DATABASE_PRINCIPAL_ID(@v_cUserId) IS NOT NULL)
BEGIN
SET @command = N'DROP USER ' + QUOTENAME(@v_cUserId) + N';'
EXEC(@command);
END;
IF (SUSER_ID(@v_cUserId) IS NOT NULL)
BEGIN
SET @command = N'DROP LOGIN ' + QUOTENAME(@v_cUserId) + N';'
EXEC(@command);
END;
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
end;
4. Совети и трикови
Со Row Level Security (RLS) на SQL Server, ова овозможува лесно одвојување на податоците на корисниците, но додава малку комплексност на планот за извршување на секој упит што ги користи таблиците на кои е овозможен RLS.
Целта е да се минимизира таа комплексност на планот за извршување на упитот.
- Употреба во складирани процедури
Избегнувајте многу спојувања со RLS таблици. Ако треба да споите многу таблици, подобро е да споите неколку (2-4 таблици), да го ставите резултатот во привремена табела (која може дури и да биде правилно индексирана) и да ја споите таа привремена табела со други таблици.
Ова ќе ја олесни работата на оптимизаторот на упити бидејќи упитот е поделен на повеќе парчиња.
- Употреба во тригери
Во тригерите по извршување, нема потреба да се спојувате со основната табела за да ги добиете податоците.
За изјавата за ажурирање или вметнување, вметнатата псевдо табела веќе содржи нови вредности кои исто така се во основната табела.
Така што, сè што треба да направите е да се споите со неа.
Ако имате сценарио каде што треба да проверите за постоење на некои податоци во тригер и да ажурирате податоци врз основа на таа проверка, подобро е да ги ставите резултатите од проверката во привремена табела, да проверите дали тие податоци ги задоволуваат посакуваните услови и да ги користите за ажурирање на основната табела.
- Поддршка на вградени функции на SQL Server за паралелизам
Ако некогаш треба да проверите корисничко име или SQL логин под кој се извршува тековниот контекст, користете ги следниве функции во select изјавите.
Тие се единствените кои поддржуваат паралелизам во плановите за извршување на SQL Server:
USER_NAME, CURRENT_USER, SUSER_NAME, SUSER_SNAME, SUSER_ID, SUSER_SID.
Секоја друга вградена функција спречува разгледување на паралелни планови за извршување на упити.