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

MySQL 動態視圖實現:基於 Session 變數的資料隔離

     編輯:MySQL 資料庫相關知識

需求

C/S 架構下,不同角色用戶透過統一視圖查看各自資料,且不得修改視圖定義、不得在視圖外再包一層查詢。

設計思路

  1. 系統產生唯一 ID(應用端或資料庫 UUID())。
  2. 將 ID 存入 Session 變數 @spid。
  3. 建立自訂函數 getSpid() 回傳該變數。
  4. 視圖定義中呼叫 getSpid() 進行過濾。

程式碼實作

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 的兩筆

核心關鍵:Session 變數隔離 + 自訂函數封裝 + 視圖內呼叫函數,實現無侵入式的動態資料隔離。

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