2016-10-05 39 views
1

我有一張桌子和相應的視圖。如何防止表列更改如果存在此列的視圖?

CREATE TABLE IF NOT EXISTS `test` (
    `id` mediumint(8) unsigned NOT NULL, 
    `test` tinyint(3) unsigned NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `test` (`id`, `test`) VALUES (DEFAULT, 1); 
INSERT INTO `test` (`id`, `test`) VALUES (DEFAULT, 2); 

CREATE OR REPLACE 
    ALGORITHM=UNDEFINED SQL SECURITY INVOKER 
VIEW `test_view` AS 
    SELECT `id`, `test` from `test`; 

我可以改變表結構,例如:

ALTER TABLE `test` CHANGE `test` `test_renamed` TINYINT(3) UNSIGNED NOT NULL; 

和所有未來的查詢,查看將被打破:

SELECT * FROM test_view; 
#1356 - View 'test_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 

如何防止表列,如果視圖中使用它們改變?

更新:我的Percona服務器5.6.32-78.0

回答

1

什麼,你不能做的是告訴你的數據庫系統拒絕意見用於列或表進行任何更改。

您可以在您的代碼中使用或甚至在任何視圖中的列中通過在information_schema.views表上編寫查詢來進行測試。但是,由您和您的用戶來執行測試,mysql不會執行測試。

由於這個原因,我通常使用包含所有視圖的腳本在我更改數據庫結構後重新創建它們。當然有時候這些查詢中的一個查詢會在更改後失敗,但這些都是您需要更改的確切視圖。

然後,您可以將新列名稱重命名爲舊列名稱,或者任何您想要執行的操作以保持您的舊視圖可用。

+0

<「我通常使用包含所有視圖的腳本在我更改數據庫結構後重新創建它們。」 > 嗯,這聽起來很有趣。也許,我可以拆分遷移工作流並將視圖遷移與常見遷移分開保存。每次執行一次通用遷移或完成遷移過程後執行它們。 – kivagant

相關問題