Можно ли изменить таблицу в mySql с помощью хранимых процедур?

вот что я хотел бы сделать в mySQL... У меня такое ощущение, что это просто невозможно, но хотелось бы ошибиться...

create procedure foo(IN MYTABLE varchar(50) , IN COLNAME varchar (50), IN MYTYPE varchar(50)) 
begin 
IF (select count(*) from information_schema.columns where table_name =MYTABLE and column_name = COLNAME) = 0 
THEN
alter table MYTABLE add column MYNAME MYTYPE; 
end;

call foo( 'table_foo' , 'column_bar' , 'varchar(100)' );

person Yevgeny Simkin    schedule 13.02.2009    source источник


Ответы (2)


Не знаю, зачем вам это нужно, но это возможно:

DELIMITER //
DROP PROCEDURE foo//
CREATE PROCEDURE foo(IN MYTABLE varchar(50) , IN COLNAME varchar (50), IN MYTYPE varchar(50))
BEGIN
  SET @ddl = CONCAT('alter table ', MYTABLE, ' add column (', COLNAME, ' ', MYTYPE, ')');
  PREPARE STMT FROM @ddl;
  EXECUTE STMT;
END;
//
person Quassnoi    schedule 13.02.2009
comment
Вау, поговорим о SQL-инъекциях! - person Randolpho; 14.02.2009
comment
Ни в коем случае не то, что я бы посоветовала своим детям, но это все же возможно :) - person Quassnoi; 14.02.2009

Краткий ответ, почему я бы это сделал.

Обновление развернутой базы данных при изменении версии вашей схемы в выпущенном продукте. Сценарии оболочки — плохой вариант для кросс-платформенного кода, поэтому сценарии на SQL — это прекрасно, просто не забудьте удалить процедуры после использования. Если я развернул 1.1, но на момент обновления у меня 1.4, я просто запускаю сценарии 1.1-> 1.2, 1.2-> 1.3 и 1.3-> 1.4 по порядку.

person jshanab    schedule 11.05.2011