2014-01-26 82 views
2

我有一個表..創建視圖動態的MySQL

MySQL table

此表被用新的記錄,每次從客戶端的用戶進行更新。

我想要的是爲team_id的所有不同值創建一個視圖,team_id的值不固定..可以在1-16範圍內,在另一個時間範圍1-8 ..在任何範圍內..

所以我想是對每一條記錄(視圖名稱爲:view_of_team + NEW.team_id)動態地創建視圖(=>觸發器)插入此表..

我試圖執行創建視圖的語句在後插入觸發器,但MySQL不僅僅是創建觸發器..然後,我在從插入觸發器後調用一個程序時降落

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_view_if_not_exists_stored_proc`(IN `team_id` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 
if not exists(select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_TYPE like 'VIEW' and TABLE_NAME like concat('view_of_team', team_id)) then 

     SET @ViewName = concat('view_of_team', cast(team_id as char(50))); 
     SET @sql = concat('create view ', @ViewName, ' as select * from mini_events_score_log where team_id=', team_id); 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
end if 

和刀片觸發上面

在我phpMyAdmin的單獨執行程序中所示的表之後內部使用CALL create_view_if_not_exists_stored_proc(NEW.team_id)創建視圖,但該錯誤出現了:「動態SQL中存儲的功能或觸發器不允許」時插入之後執行觸發新紀錄..

有沒有辦法在這種情況下,動態地創建視圖..

回答

2

你在做什麼有意義的唯一方法是,如果你相信MySQL視圖存儲數據的子集分開基表。

事實並非如此。將MySQL VIEW視爲針對基表的更復雜查詢的別名。查詢視圖而不是基表的性能或效率沒有優勢。

事實上,根據查詢,MySQL甚至可能比查詢基表查詢。由於可以定義VIEW的某些類型的查詢將隱式地導致查詢創建臨時表。

有兩個原因在MySQL中創建一個視圖:

  • 首先是限制訪問權限,所以你可以授予用戶訪問查詢視圖,查詢只是列的子集或基表的行。用戶不會在基表上擁有直接權限,只需查看VIEW的權限即可。

  • 第二個原因是爲了方便,所以你可以查詢一個簡單的VIEW作爲複雜查詢的別名,所以你不必在你的應用中多次重複複雜的查詢。

但在你的例子中,你爲VIEW定義的查詢本身非常簡單。別名此查詢的好處很少。

而且您必須針對右側的視圖生成查詢,這意味着從用戶輸入格式化視圖名稱。如果你不小心,這聽起來像是一個獲得SQL注入漏洞的機會。

我建議忘記這個想法,爲每個不同的團隊創建一個視圖。只需查詢基表,然後在查詢時添加WHERE子句。這比在數百個類似命名的視圖之間選擇更容易,甚至可以使用查詢參數作爲團隊ID,這樣您就可以保護自己免受SQL注入漏洞的威脅。

+0

啊哈ThankYou的答覆,即使我想沒有這樣的意見..但..實際上,當插入記錄在基表中,有很多混亂和其他東西在實時發生,所以想讓它很容易DBA會自動過濾每個不同團隊的記錄......如果他在查詢中編寫並編輯值並在每次他想僅查看基本1k條記錄中所需團隊數據時觸發它,將會非常不方便表 – ritesht93

+0

好吧,它要麼寫一個WHERE子句來指定一個給定的team_id值,要麼寫一個完整的*不同的查詢*來爲相應的團隊讀取正確的視圖。我不相信任何DBA會覺得前者很困難。 –