C/S 架構應用,不同角色用戶查詢同一視圖但見到不同資料。要求:不修改視圖定義、不在外層包裝查詢。
UUID())@spidgetSpid() 回傳該變數WHERE 條件呼叫 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:用戶 A
SET @spid = 1;
SELECT * FROM v_test;
-- 結果:test1, test11, test111
-- Session 2:用戶 B
SET @spid = 2;
SELECT * FROM v_test;
-- 結果:test2, test22
| 元件 | 作用 |
|---|---|
@spid | Session 級用戶變數,連線隔離,互不干擾 |
getSpid() | 確定性函數,包裝變數讀取,供視圖呼叫 |
v_test | 視圖定義固定,執行時動態帶入當前 Session 的 @spid |
@tenant_id 隔離客戶資料@role_id 配合權限表過濾@show_deleted 控制是否顯示已刪除資料DETERMINISTIC 或 READS SQL DATA(MySQL 8.0+ 預設嚴格檢查)SET @spid = ?)ROW_LEVEL_SECURITY、MariaDB SECURITY POLICY 原生支援行級安全