C/S 架構下,不同角色用戶透過統一視圖查看各自資料,且不得修改視圖定義、不得在視圖外再包一層查詢。
UUID())。@spid。getSpid() 回傳該變數。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 變數隔離 + 自訂函數封裝 + 視圖內呼叫函數,實現無侵入式的動態資料隔離。