首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 動態視圖實作:Session 變數搭配自訂函數實現多租戶資料隔離

     編輯:MySQL 資料庫相關知識

需求:C/S 架構系統,依用戶角色顯示不同資料。系統依標識產生資料內容,再透過統一視圖存取。限制:不可修改視圖、不可在視圖外再包一層查詢。

設計思路

系統產生唯一 ID(應用端或資料庫 UUID()),視圖關聯此 ID。利用 Session 變數儲存 ID,自訂函數回傳,視圖呼叫函數過濾。

完整程式碼

DROP TABLE IF EXISTS test;
CREATE TABLE test (
  id INT NOT NULL,
  name VARCHAR(20) NOT NULL
);
INSERT INTO test VALUES (1,'test1'), (1,'test11'), (1,'test111'), (2,'test2'), (2,'test22');

DROP FUNCTION IF EXISTS getSpid;
DELIMITER |
CREATE FUNCTION getSpid() RETURNS INT
RETURN @spid;
|
DELIMITER ;

DROP VIEW IF EXISTS v_test;
CREATE VIEW v_test AS
SELECT * FROM test WHERE id = getSpid();

-- 測試
-- Session 1
SET @spid = 1;
SELECT * FROM v_test;  -- 顯示 id=1 的三筆

-- Session 2
SET @spid = 2;
SELECT * FROM v_test;  -- 顯示 id=2 的兩筆

關鍵點說明

  1. 將生成的 ID 存入 Session 變數 @spid
  2. 建立自訂函數 getSpid() 回傳此變數
  3. 視圖 WHERE 條件呼叫 getSpid() 實現動態過濾

此法滿足「不修改視圖定義、不外層包查詢」限制,實現多租戶/角色資料隔離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved