Atualizador de BD via Delphi

Delphi

25/08/2011

Olá pessoal tudo bom?   Gostaria de uma ajuda de vocês. To tentando criar um atualizador de banco de dados, pra distribuir com a aplicação que tiver alteração no banco.   Pensei em fazer um exe em delphi mesmo, então criei uma aplicaçao, coloquei um SQLConnection, um SQLDataSet, um Button e um Label e fiz o código abaixo, que funcionou:       SqlDataSet1.Close;
    with SqlDataSet1 do
      begin
        close;
        CommandText :=
          'CREATE TABLE TB_TESTE2 ('
          + 'PKCOD_TESTE2      BIGINT NOT NULL,'
          + 'NOME_TESTE2       VARCHAR(50) NOT NULL COLLATE PT_BR,'
          + 'NOME_COMPLETO_TESTE2  VARCHAR(50) COLLATE PT_BR)';
        open;
      end;   Só que quando tentei botar um "alter table", assim:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'CREATE TABLE TB_TESTE2 ('
+ 'PKCOD_TESTE2 BIGINT NOT NULL,'
+ 'NOME_TESTE2 VARCHAR(50) NOT NULL COLLATE PT_BR,'
+ 'NOME_COMPLETO_TESTE2 VARCHAR(50) COLLATE PT_BR);'
+ 'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
open;
end;   Não funcinou, deu erro no "alter". Ainda tente fazer primeiro o create table e depois o alter como abaixo:
    SqlDataSet1.Close;
    with SqlDataSet1 do
      begin
        close;
        CommandText :=
          'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
        open;
      end;   E também não funcinou. Ele só funcionou quando eu fiz, primeiro o create table, sem o alter, depois parei a aplicaçao, comentei o create table e rodei só o alter table, aí funcionou.   Alguém saberia porque eles não funcionam juntos? Pois eu ainda pretendo criar generators e triggers desse mesmo jeito, e gostaria que fosse tudo numa tacada só.   Grato pela atenção. Abraços.
Allan Ramos

Allan Ramos

Curtidas 0

Respostas

Allan Ramos

Allan Ramos

25/08/2011

Opa, eu denovo. Consegui achar uma solução e gostaria de compartilhar com vocês.
Primeiro eu criei 3 variáveis, como abaixo:
  TesteSQLTabela: String;  TesteSQLGerador: String;  TesteSQLTrigger: String;

Depois eu fiz cada variável receber o seu código sql como abaixo. Aproveitei pra criar chave estrangeira no 'Create Table', pra fazer um teste e funcionou:
  TesteSQLTabela := 'CREATE TABLE TB_TESTE4'              + '('              + 'PKCOD_TESTE4 BIGINT NOT NULL,'              + 'FKCOD_TESTE1 BIGINT NOT NULL,'              + 'NOME_TESTE4 VARCHAR(50) NOT NULL COLLATE PT_BR,'              + 'NOME_COMPLETO_TESTE4 VARCHAR(50) COLLATE PT_BR,'              + 'CONSTRAINT PK_TB_TESTE4 PRIMARY KEY (PKCOD_TESTE4),' // Chave Primária              + 'CONSTRAINT FK_TB_TESTE4_1 FOREIGN KEY (FKCOD_TESTE1) REFERENCES TB_TESTE1 (PKCOD_TESTE1) ON DELETE CASCADE ON UPDATE CASCADE' // Chave Estrangeira              + ')';
  TesteSQLGerador := 'CREATE GENERATOR GEN_TB_TESTE4_ID';
  TesteSQLTrigger := 'CREATE TRIGGER TB_TESTE4_BI FOR TB_TESTE4 '#10                     + 'ACTIVE BEFORE INSERT POSITION 0 '#10                     + 'AS '#10                     + 'BEGIN '#10                     + '  IF (NEW.PKCOD_TESTE4 IS NULL) THEN '#10                     + '    NEW.PKCOD_TESTE4 = GEN_ID(GEN_TB_TESTE4_ID,1); '#10                     + 'END';

Depois de as variáveis estarem com seu conteúdo, fiz o ExecSQL, conforme abaixo:
        SqlDataSet1.CommandText := TesteSQLTabela;        SqlDataSet1.ExecSQL(False);
        SqlDataSet1.CommandText := TesteSQLGerador;        SqlDataSet1.ExecSQL(False);
        SqlDataSet1.CommandText := TesteSQLTrigger;        SqlDataSet1.ExecSQL(False);

Tive que fazer um procedimento por vez, senão não funcionava. Deste jeito funcionou perfeitamente. Quem precisar usar pra criar um atualizador de tabelas, está aí o código, é só implementar no que achar melhor.
Abraços.
GOSTEI 0
POSTAR