RLS - Vprašanja in odgovori

- RLS_ALL uporabnikI
- Dodajanje uporabnikov
- Brisanje uporabnikov
- Nasveti in triki
|
1. RLS_ALL uporabniki
RLS_ALL je poseben uporabnik na bazi podatkov brez možnosti prijave na server.
Edini način, da ga uporabite, je z EXECUTE AS USER = 'RLS_ALL'
Ima dostop do vseh podatkov, ki so ločeni s funkcionalnostjo RLS.
Ta uporabnik se na primer uporablja za ustvarjanje agregiranih podatkov, ki so v lasti več uporabnikov.
Na primer poročilo o skupni prodaji za vse zaposlene za eno leto, vendar lahko vsak zaposleni vidi samo svojo prodajo.
Da lahko uporabnik pantheona uporablja EXECUTE AS USER = 'RLS_ALL', mora imeti dovoljenja GRANT IMPERSONATE za uporabnika RLS_ALL.
2. Dodajanje uporabnikov
Dodajanje uporabnikov za dostop do drugih aplikacij v PANTHEON bazo podatkov.
S PANTHEON-om lahko dodamo uporabnika:
Preverite navodila: Dodajanje in brisanje uporabnika ter Avtorizacije.
Za bolj kompleksne nastavitve, kjer želimo dodati uporabnika na več podatkovnih bazah.
Dodajanje uporabnikov in dodeljevanje avtorizacij brez pravic. Nastavimo pravico uporabnika z PANTHEON-om:
declare
@v_cUserId sysname = 'SALES001'
, @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;--no authorizations
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;
end;
select * from [dbo].[tHE_SetSubjContact] WHERE acUserId = @v_cUserId;
select * from tPA_SetDoctypeUserSecurity where anUserId = @p_user_id;
end;
3. Brisanje uporabnikov
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. Namigi in triki
Z vzpostavljeno zaščito na ravni vrstic (RLS) to doda preprosto ločevanje uporabniških podatkov, vendar doda malo kompleksnosti pri izvajanju poizvedb za tabele, v katerih je RLS omogočen.
Cilj je čim bolj zmanjšati kompleksnosti izvajanja poizvedb.
Uporaba v shranjenih procedurah (stored procedures)
Izogibajte se številnim spajanjem (join) s tabelami RLS. Če morate združiti veliko tabel skupaj, je bolje, da jih združite nekaj (2-4 tabele), rezultat tega postavite v začasno tabelo (ki jo je mogoče celo pravilno indeksirati) in to začasno tabelo pridružite drugim tabelam .
To bo olajšalo delo optimizatorja poizvedb, saj je poizvedba razdeljena na več delov.
Uporaba pri sprožilcih (triggers)
V sprožilcih se ni treba pridružiti osnovni tabeli, da bi dobili podatke.
Za update in insert stavek vstavljena pseudo tabela že vsebuje nove podatke ki obstajajo v osnovni tabeli.
Vse kar je potrebno storiti je da jih združite.
Če imate scenarij, v katerem morate preveriti obstoj nekaterih podatkov v sprožilcu in posodobiti podatke na podlagi tega preverjanja, je bolje, da rezultate preverjanja vstavite v začasno tabelo. Preverite, ali ti podatki izpolnjujejo želeni pogoj, in jih uporabite za posodobitev osnovne tabele.
- Podpora vgrajene funkcije SQL Server za vzporednost (parallelism)
Če boste kdaj morali preveriti uporabniško ime ali prijavo SQL, pod katero se izvaja trenutni kontekst, uporabite naslednje funkcije v izbranih stavkih.
So edini, ki podpirajo vzporednost v načrtih izvajanja SQL serverja: USER_NAME, CURRENT_USER, SUSER_NAME, SUSER_SNAME, SUSER_ID, SUSER_SID. Katera koli druga vgrajena funkcija preprečuje upoštevanje vzporednih izvedbenih načrtov poizvedb.