PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL:Tìm quyền cho phần tử, chuyển tới thư mục gốc

Bạn có thể sử dụng RECURSIVE CTE cho điều này:

WITH RECURSIVE Perms(ID, Name, ParentID, CanRead, CanWrite, CanDelete) AS (
   SELECT i.ID, i.Name, l.LID AS ParentID, p.CanRead, p.CanWrite, p.CanDelete
   FROM Item AS i
   LEFT JOIN Permission AS p ON i.ID = p.ID
   LEFT JOIN Links AS l ON i.ID = l.ID
),  GET_PERMS(ID, ParentID, CanRead, CanWrite, CanDelete) AS (
    -- Anchor member: Try to get Read/Write/Delete values from Permission table
    SELECT ID, ParentID, CanRead, CanWrite, CanDelete
    FROM Perms
    WHERE ID = 3

  UNION ALL

    -- Recursive member: terminate if the previous level yielded a `NOT NULL` result
    SELECT p.ID, p.ParentID, p.CanRead, p.CanWrite, p.CanDelete
    FROM GET_PERMS AS gp 
    INNER JOIN Perms AS p ON gp.ParentID = p.ID    
    WHERE gp.CanRead IS NULL
)
SELECT CanRead, CanWrite, CanDelete 
FROM GET_PERMS
WHERE CanRead IS NOT NULL

RECURSIVE CTE chấm dứt khi Permission bản ghi đã được truy xuất từ ​​cơ sở dữ liệu.

Demo tại đây



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. viết bảng vào Postgresql bằng rPostgreSQL khi tên cơ sở dữ liệu là chữ in hoa

  2. Đếm khoảng cách được nhóm theo thời gian cho phạm vi thời gian

  3. Hủy một phiên / kết nối postgresql

  4. Sequelize Lỗi tải háo hức khi bao gồm mô hình liên quan

  5. Delegate System.Action <dynamic, int> không nhận đối số `1 '