需求: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 的兩筆
@spidgetSpid() 回傳此變數WHERE 條件呼叫 getSpid() 實現動態過濾此法滿足「不修改視圖定義、不外層包查詢」限制,實現多租戶/角色資料隔離。