我有一张桌子..
此表每次都会从客户端用户更新新记录。
我想要的是为team_id的所有不同值创建一个视图,team_id值不固定..可以在1到1的范围内,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
并在上面显示的表格的插入触发器后面使用CALL create_view_if_not_exists_stored_proc(NEW.team_id)
在我的PhpMyAdmin中单独执行过程会创建视图但出现错误:“在插入新记录后执行触发器时,”存储函数或触发器中不允许动态SQL“..
在这种情况下,有没有办法动态创建视图..
答案 0 :(得分:2)
如果您认为MySQL VIEW与基表分开存储数据子集,那么您所做的唯一方法是有意义的。
事实并非如此。可以将MySQL VIEW视为针对基表的更复杂查询的别名。查询视图而不是基表的性能或效率没有任何优势。
实际上,根据查询,MySQL甚至可以比查询基表有效地查询 less 。因为您可以定义VIEW的某些类型的查询将隐式地使查询创建临时表。
在MySQL中创建VIEW有两个原因:
第一个是限制访问权限,因此您可以授予用户查询VIEW的权限,该查询仅查询基表的列或行的子集。用户不会对基表拥有直接权限,只具有查询VIEW的权限。
第二个原因是为了方便起见,因此您可以将简单的VIEW查询为复杂查询的别名,因此您不必在应用中多次重复复杂查询。
但在您的示例中,您定义VIEW的查询本身非常简单。别名此查询的好处很少。
您必须针对右侧视图生成查询,这意味着从用户输入格式化视图名称。如果您不小心,这听起来像是一个获得SQL注入漏洞的机会。
我建议忘记这个想法,为每个不同的团队创建一个视图。只需查询基表,并在查询时添加WHERE子句。这比在数百个类似命名的视图中选择更容易,甚至可以使用查询参数作为团队ID,这样您就可以保护自己免受SQL注入漏洞的侵害。