Power BI: Row Level Security cấu trúc tổ chức

Một bài toán rất hay gặp khi phân quyền dữ liệu đó là cấu trúc tổ chức Organization Hierachy. Với cấu trúc này, mỗi nhân viên chỉ được xem dữ liệu của chính họ, trong khi quản lý sẽ được xem dữ liệu của toàn bộ nhân viên dưới quyền. Để tổ chức phân quyền dữ liệu dạng này trên Power BI chúng ta xét ví dụ dưới đây:

Giả thiết rằng ta có cấu trúc tổ chức và báo cáo bán hàng như hình trên. Khi đó Cuong Do và Jeff Bezos chỉ được xem dữ liệu của chính mình. Bill Gates sẽ được xem dữ liệu của Bill, Cuong Do và Jeff Bezos. Quang Nguyen sẽ được xem dữ liệu của Quang, Bill, Cuong và Jeff.

Tổ chức dữ liệu

Ta có bảng dữ liệu SalePerson như sau:

Cột Manager ID sẽ chứa ID của SalePerson đóng vai trò là quản lý tương ứng.

Bảng SaleTransaction chứa số liệu kinh doanh của mỗi người

Hai bảng SalePersonSaleTransaction quan hệ 1:n với nhau thông qua IDSale ID

Thiết lập bộ lọc Hierachy Slicer cho cấu trúc tổ chức

Thiết lập báo cáo như hình 1, tuy nhiên Slicer mặc định của Power BI có cấu trúc phẳng. Để hiển thị Slicer cấu trúc dạng tổ chức ta tiến hành như sau:

Trong mục VISUALIZATIONS chọn Import from marketplace

Trong cửa sổ Power BI Visuals tìm đến HierachySlicer và chọn Add vào Power BI

HierachySlicer sẽ được thêm vào VISUALS

Tuy nhiên để HierachySlicer hiển thị theo đúng cấu trúc mong muốn, chúng ta cần tổ chức lại dữ liệu bảng SalePerson như sau

Sử dụng hàm PATH trong DAX

PATH(<ID_columnName>, <parent_columnName>)

Hàm này trả về chuỗi ký tự chứa ID của tất cả các cha theo nhiều mức cho đến cùng cho đối tượng tìm kiếm

Ta thiết lập một Calculated Column có tên là Path như sau:

Tiếp đến kết hợp hàm LOOKUPVALUEPATHITEM để tìm ra tên của các Organization Level 1 đến Level 3 như sau

Org Level1 = LOOKUPVALUE(SalePerson[Name],SalePerson[ID], PATHITEM(SalePerson[Path],1,1))

Org Level2 = LOOKUPVALUE(SalePerson[Name],SalePerson[ID], PATHITEM(SalePerson[Path],2,1))

Org Level3 = LOOKUPVALUE(SalePerson[Name],SalePerson[ID], PATHITEM(SalePerson[Path],3,INTEGER))

Khi đó sử dụng HierachySlicer ta có cấu trúc tổ chức như sau

Kết quả lọc dữ liệu theo cấu trúc

Thiết lập Role để lọc theo người dùng đăng nhập

Bây giờ chúng ta sẽ tạo mới Role để Power BI sẽ tự động lọc dữ liệu theo tài khoản người dùng đăng nhập. Ta thiết lập Role có tên là Sale với cấu trúc lọc DAX expression cho bảng SalePerson như sau

PATHCONTAINS(SalePerson[Path],MaxX(Filter(SalePerson,[email]=USERPRINCIPALNAME()),SalePerson[ID]))

  • Hàm Filter sẽ lọc ra tất cả các dữ liệu trong bảng SalePerson có email trùng với email tài khoản đăng nhập
  • Hàm MaxX sẽ lấy ra ID của người dùng từ dữ liệu lọc Filter ở trên
  • Hàm PATHCONTAINS lọc ra các ID có trong dữ liệu cột Path của bảng SalePerson

Kiểm ta kết quả

Publish báo cáo này lên Power BI Service, thêm người dùng vào Role và kiểm tra kết quả với Bill Gates ta được như sau.

Báo cáo đã lọc ra số liệu của riêng Bill và nhân viên dưới quyền, Cuong và Jeff.

Leave a Reply