Pyetjet dhe Pëgjigjet RLS

- RLS_ALL përdorues
- Shtimi i përdoruesve
- Heqja e përdoruesve
- Këshilla dhe Trik
|
1. RLS_ALL përdorues
RLS_ALL është një përdorues i veçantë i bazës së të dhënave pa ndonjë hartim të hyrjes në server. Kjo do të thotë se nuk mund të hyni në SQL Server me të.
Një mënyrë e vetme për ta përdorur është me EXECUTE AS USER = 'RLS_ALL'
Ka qasje në të gjitha të dhënat që janë të ndara nga funksionaliteti RLS.
Ky përdorues përdoret për, për shembull, të krijojë agregate mbi të dhëna që i përkasin përdoruesve të shumtë.
Për shembull, një raport për shitjet totale për të gjithë punonjësit për një vit, por çdo punonjës mund të shohë vetëm shitjet e tij.
Për një përdorues pantheon që të jetë në gjendje të përdorë EXECUTE AS USER = 'RLS_ALL', ai duhet të ketë lejet GRANT IMPERSONATE mbi përdoruesin RLS_ALL.
VETËM përdoruesit në Pantheon duhet të kenë lejet GRANT IMPERSONATE.
Dhenia e atyre lejeve për llogaritë e ndërtuara në SQL Server (si SA, etj) zakonisht nuk është e nevojshme.
- VETËM përdoruesit e Pantheon mund të lexojnë të dhëna nga tabelat e mbrojtura nga RLS
Përdoruesi SA (nëse nuk është i hartuar me përdoruesin PA) nuk ka qasje në të dhënat e mbrojtura.
Të dhënat e mbrojtura nga RLS mund të lexohen vetëm nga përdoruesi PA me autorizimet përkatëse.
Në mënyrë që të përdoren lidhjet e jashtme me bazën e të dhënave, lidhja me bazën e të dhënave duhet të bëhet me përdoruesin PANTHEON të lidhur me përdoruesin e Bazës së të Dhënave.
2. Shtimi i përdoruesve
Shtimi i përdoruesve për të aksesuar aplikacione të tjera në bazën e të dhënave PANTHEON.
Mund të shtojmë një përdorues me PANTHEON:
Shihni udhëzimet e mëposhtme: Shtimi i një përdoruesi dhe Vendosja e autorizimeve për një përdorues.
Për cilësime më komplekse, ku duam të shtojmë një përdorues në disa baza të dhënash.
Shtimi i Përdoruesit dhe Ngarkimi i Autorizimeve pa Të Drejta. Ne vendosim lejet e përdoruesit me PANTHEON:
deklaro
@v_cUserId sysname =
#UserName#
, @p_lang_id varchar(2)
--
, @p_subject varchar(30) = NULL
--
, @p_user_id int = NULL
, @p_contact_id int = NULL
FILLIM
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
SET @p_user_id = (SELECT anUserId FROM [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId);
vendos @p_contact_id = NULL;
IF (@p_user_id IS NULL)
FILLIM
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;--pa autorizime
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;
fund;
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
select * from tPA_SetDoctypeUserSecurity where anUserId = @p_user_id;
fund;
3. Heqja e përdoruesve
deklaro
@v_cUserId sysname = #USER#,
@command nvarchar(max);
fillim
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)
FILLIM
SET @command = N'DROP USER ' + QUOTENAME(@v_cUserId) + N';'
EXEC(@command);
FUND;
IF (SUSER_ID(@v_cUserId) IS NOT NULL)
FILLIM
SET @command = N'DROP LOGIN ' + QUOTENAME(@v_cUserId) + N';'
EXEC(@command);
FUND;
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
fund;
4. Këshilla dhe Trik
Me Sigurinë e Nivelit të Rreshtit (RLS) të SQL Server në vend, kjo shton ndarjen e lehtë të të dhënave të përdoruesve, por shton pak kompleksitet në planin e ekzekutimit të pyetjeve për çdo pyetje që përdor tabelat që kanë RLS të aktivizuar mbi to.
Qëllimi është të minimizohet ai kompleksitet i planit të ekzekutimit të pyetjeve.
- Përdorimi në procedurat e ruajtura
Shmangni shumë bashkime me tabelat RLS. Nëse keni nevojë të bashkoni shumë tabela së bashku, është më mirë të bashkoni disa (2-4 tabela), vendosni rezultatin e atyre në një tabelë përkohshme (që mund të indeksohet siç duhet) dhe bashkoni atë tabelë përkohshme me tabela të tjera.
Kjo do ta bëjë punën e optimizuesit të pyetjeve më të lehtë pasi pyetja është e ndarë në pjesë të shumta.
- Përdorimi në triggera
Në triggerat pas, nuk ka nevojë të bashkoheni me tabelën bazë për të marrë të dhënat.
Për deklaratën e përditësimit ose të inserimit, tabela pseudo e futur tashmë përmban vlera të reja që janë gjithashtu në tabelën bazë.
Pra, gjithçka që duhet të bëni është të bashkoheni me të.
Nëse keni një skenar ku duhet të kontrolloni ekzistencën e disa të dhënave në një trigger dhe të përditësoni të dhënat në bazë të atij kontrolli, është më mirë të vendosni rezultatet e kontrollit në një tabelë përkohshme, kontrolloni nëse ato të dhëna përmbushin kushtin e dëshiruar dhe përdorni atë për të përditësuar tabelën bazë.
- Mbështetje e funksioneve të ndërtuara të SQL Server për paralelizmin
Nëse ndonjëherë duhet të kontrolloni një emër përdoruesi ose një hyrje SQL nën të cilën konteksti aktual po ekzekutohet, përdorni funksionet e mëposhtme në deklaratat select.
Ato janë të vetmet që mbështesin paralelizmin në planet e ekzekutimit të SQL Server:
USER_NAME, CURRENT_USER, SUSER_NAME, SUSER_SNAME, SUSER_ID, SUSER_SID.
Çdo funksion tjetër të ndërtuar parandalon shqyrtimin e planeve të ekzekutimit të pyetjeve në paralel.