我有一个表和相应的视图。
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条答案
按热度按时间qvsjd97n1#
您不能告诉数据库系统拒绝对视图中使用的列或表所做的任何更改。
您可以在代码中放置一个测试,以便在任何视图中使用表甚至列,方法是在
information_schema.views
table。但是,测试由您和您的用户来执行,mysql不会强制执行。因此,我通常在更改数据库结构后使用包含所有视图的脚本来重新创建它们。当然,有时这些查询中的一个会在更改后失败,但是这些正是您需要更改的视图。
然后,可以将新列名重命名为旧列名,或者执行任何操作以保持旧视图可用。