Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

/*******************************************************************************

********************** Row-Level Security (RLS) *******************


********************************************************************************/
alter database RLS set single_user with rollback immediate
--- Creation de la BDD
drop database RLS
CREATE DATABASE RLS

USE RLS
GO

--drop table ventes

-- Creation de la table
CREATE TABLE Ventes(
OrderID int,
SalesUsername varchar(50),
Product varchar(10),
Qty int
)

-- Insertion de 6 lignes 1 pour 1 vendeur appel� Vendeur1 et l'autre appel� Vendeur


2
INSERT Ventes VALUES
(1, 'Vendeur1', 'Renault', 5),
(2, 'Vendeur1', 'Peugeot', 2),
(3, 'Vendeur1', 'Nissan', 4),
(4, 'Vendeur2', 'Porsche', 2),
(5, 'Vendeur2', 'Audi', 5),
(6, 'Vendeur2', 'BMW', 5)

-- Que donne le select ?

SELECT * FROM Ventes

-- Creation du compte manager et des deux vendeurs :

CREATE USER Manager WITHOUT LOGIN


CREATE USER Vendeur1 WITHOUT LOGIN
CREATE USER Vendeur2 WITHOUT LOGIN
create USER Vendeur3 WITHOUT LOGIN

-- Donnons les droits plus �largis au manager et le SELECT aux vendeurs :

GRANT SELECT, INSERT, UPDATE, DELETE ON Ventes TO Manager


GRANT SELECT ON Ventes TO Vendeur1
GRANT SELECT ON Ventes TO Vendeur2
GRANT SELECT ON Ventes TO Vendeur3
GO

-- Create the predicate function


create FUNCTION fn_securitypredicate(@Username AS varchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT
1 AS fn_securitypredicate_result
WHERE
DATABASE_PRINCIPAL_ID() = DATABASE_PRINCIPAL_ID(@Username)----Va
checker l'username dans la colonne SalesUsername de la table ventes
or DATABASE_PRINCIPAL_ID() = DATABASE_PRINCIPAL_ID('Manager')
--- si c'est manager full droit car pas referenc� dans la colonne

GO
--- faisons un Select pour bien comprendre :

select SalesUsername from Ventes

-- creation d'une security policy pour affiner le RLS

CREATE SECURITY POLICY dbo.SalesPolicyFilter


ADD FILTER PREDICATE dbo.fn_securitypredicate(SalesUsername) ---- La security
policy est affect� sur la colonne Vendeur c'est ca qu'il faut bien comprendre
ON dbo.ventes
WITH (STATE = ON)

-- le RLS est en place, si je fais le select avec mon compte que se passe t il ?

SELECT * FROM Ventes


SELECT COUNT(*) FROM Ventes

-- Avec le vendeur1 je vois juste mes ventes


EXECUTE AS USER = 'vendeur1'
SELECT * FROM Ventes
SELECT COUNT(*) FROM Ventes
REVERT

-- Avec le vendeur2 je vois juste mes ventes


EXECUTE AS USER = 'vendeur2'
SELECT * FROM Ventes
SELECT COUNT(*) FROM Ventes
REVERT

-- Et le vendeur 3 ?
EXECUTE AS USER = 'vendeur3'
SELECT * FROM Ventes
SELECT COUNT(*) FROM Ventes
REVERT

-- En tant que Manager, full droit


EXECUTE AS USER = 'Manager'
SELECT * FROM Ventes
REVERT

-- Comme vendeur1, Puis je modifier ou updater des lignes ?


EXECUTE AS USER = 'vendeur1'
INSERT Ventes VALUES (7, 'vendeur1', 'Valve', 2)
UPDATE ventes SET Product = 'Screw' WHERE OrderId = 3
DELETE ventes WHERE OrderId = 2
REVERT

-- En tant que Manager, full droit :


EXECUTE AS USER = 'Manager'
INSERT Ventes VALUES (7, 'vendeur2', 'Valve', 1) -- Insertion d'une
valeur 7 pour le vendeur2
DELETE Ventes WHERE OrderId = 2 --
Supression de la ligne 2 pour le vendeur1
SELECT * FROM Ventes
REVERT

--- Suite a l'update du manager combien je vois de lignes ?

EXECUTE AS USER = 'vendeur1'


SELECT * FROM ventes -- 2 est parti
SELECT COUNT(*) FROM ventes
REVERT

EXECUTE AS USER = 'vendeur2'


SELECT * FROM ventes -- 7 est rajout�
SELECT COUNT(*) FROM ventes
REVERT

-- POur desactiver le RLS je desactive la security policy :

SELECT * FROM ventes -- pas de lignes


ALTER SECURITY POLICY SalesPolicyFilter WITH (STATE = OFF)
SELECT * FROM ventes

You might also like