| Exibir mensagem anterior :: Exibir próxima mensagem | 
	
	
		| Autor | Mensagem | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Ter Jan 19, 2021 5:21 pm    Assunto: |   |  
				| 
 |  
				| Boa tarde, 
 Não sei ao certo qual componente do Firedac deve ser utilizado para execução de scripts, mas segue um exemplo de script que verifica se existe uma unique com o campo na tabela e cria se não existir:
 
 
  	  | Código: |  	  | execute block as begin
 if (not exists
 (
 select * from rdb$indices as i
 inner join rdb$index_segments as s on i.rdb$index_name = s.rdb$index_name
 where i.rdb$unique_flag = 1 and i.rdb$relation_name = 'Tabela' and s.rdb$field_name = 'Campo'
 )
 ) then
 execute statement
 'alter table Tabela ADD CONSTRAINT NomeIndice unique (Campo)';
 end
 | 
 
 Espero que ajude
 
 Editado pela última vez por imex em Qui Set 16, 2021 9:07 am, num total de 1 vez
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 2:05 pm    Assunto: |   |  
				| 
 |  
				| Boa tarde, até da certo, mais toda vez que eu vou chamar de novo gera um aviso 
 O método
 
  	  | Código: |  	  | procedure TDMConexao.Criar_Unique(const ANomeTabela, ANomeCampo, ANomeIndice: String); var
 Qry: TFDQuery;
 begin
 inherited;
 Qry := TFDQuery.Create(nil);
 try
 Qry.Connection := DMConexao.Connection;
 Qry.Close;
 Qry.SQL.Clear;
 Qry.SQL.Text :=
 ' EXECUTE BLOCK AS ' +
 ' BEGIN ' +
 '   IF (NOT EXISTS ' +
 '    (' +
 '       SELECT * FROM RDB$INDICES AS I ' +
 '   INNER JOIN RDB$INDEX_SEGMENTS AS S ON I.RDB$INDEX_NAME = S.RDB$INDEX_NAME ' +
 '        WHERE I.RDB$UNIQUE_FLAG = 1 AND ' +
 '              I.RDB$RELATION_NAME = ' + QuotedStr(ANomeTabela) +
 '          AND S.RDB$FIELD_NAME = ' + QuotedStr(ANomeCampo) +
 '    ) ' +
 ' ) THEN ' +
 '  EXECUTE STATEMENT ' +
 '  ''ALTER TABLE ' + ANomeTabela +
 '   ADD CONSTRAINT ' + ANomeIndice +
 '    UNIQUE ('+ ANomeCampo +')''; ' +
 '  END ';
 Qry.ExecSQL;
 finally
 Qry.Free;
 end;
 end;
 | 
 
 Esse método deixo no sistema ai tem que verificar se ja existe então não executar mais.
 
 Só que ai ele está executando novamente e gera um aviso
 
 
  	  | Código: |  	  | --------------------------- [FireDAC][Phys][FB]unsuccessful metadata update
 
 Index IDX_CD_USUARIO already exists
 
 At block line: 1, col: 302.
 ---------------------------
 OK
 ---------------------------
 | 
 
 Ai criei uma função para verificar se o index ja existe
 
  	  | Código: |  	  | function TDMConexao.VerificaExisteIndice(Conexao: TFDConnection; NomeIndice: String): Boolean;
 var
 sSQL: String;
 Qry: TFDQuery;
 begin
 Qry := TFDQuery.Create(nil);
 try
 Qry.Connection := Conexao;
 sSQL := 'SELECT RDB$INDEX_NAME FROM RDB$INDICES WHERE RDB$INDEX_NAME = ' +
 QuotedStr(UpperCase(NomeIndice));
 Qry.Close;
 Qry.SQL.Clear;
 Qry.SQL.Add(sSQL);
 Qry.Open;
 Result := (not Qry.IsEmpty);
 finally
 Qry.Free;
 end;
 end;
 | 
 
 Ai da certo, mais se la no metodo tem uma linha de verificação
 
  	  | Citação: |  	  | if (not exists (
 select * from rdb$indices as i
 | 
 Não deveria ignorar? Ou estou fazendo errado?
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 2:32 pm    Assunto: |   |  
				| 
 |  
				| Boa tarde, 
 Com o "If Not Exists" o "Alter Table" não deveria ser executado quando a unique já existe.
 Tente executar o script utilizando um TFDScript ou até mesmo o método ExecSQL do TFDConnection para ver se ocorre esse problema.
 E você também pode testar o script através do IBExpert ou outra ferramenta semelhante para ver se também ocorre esse problema.
 
 Espero que ajude
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 2:52 pm    Assunto: |   |  
				| 
 |  
				|  	  | imex escreveu: |  	  | Boa tarde, 
 Com o "If Not Exists" o "Alter Table" não deveria ser executado quando a unique já existe.
 Tente executar o script utilizando um TFDScript ou até mesmo o método ExecSQL do TFDConnection para ver se ocorre esse problema.
 E você também pode testar o script através do IBExpert ou outra ferramenta semelhante para ver se também ocorre esse problema.
 
 Espero que ajude
 | 
 
 Utilizando FDScript aparece o aviso em modo debbug, mais modo normal não
 
 
  	  | Código: |  	  | with FDScript do begin
 SQLScripts.Clear;
 SQLScripts.Add;
 with SQLScripts[0].SQL do
 begin
 Text :=
 ' EXECUTE BLOCK AS ' +
 ' BEGIN ' +
 '   IF (NOT EXISTS ' +
 '    (' +
 '       SELECT * FROM RDB$INDICES AS I ' +
 '   INNER JOIN RDB$INDEX_SEGMENTS AS S ON I.RDB$INDEX_NAME = S.RDB$INDEX_NAME ' +
 '        WHERE I.RDB$UNIQUE_FLAG = 1 AND ' +
 '              I.RDB$RELATION_NAME = ' + QuotedStr(ANomeTabela) +
 '          AND S.RDB$FIELD_NAME = ' + QuotedStr(ANomeCampo) +
 '    ) ' +
 ' ) THEN ' +
 '  EXECUTE STATEMENT ' +
 '  ''ALTER TABLE ' + ANomeTabela +
 '   ADD CONSTRAINT ' + ANomeIndice +
 '    UNIQUE ('+ ANomeCampo +')''; ' +
 '  END ';
 end;
 ValidateAll;
 ExecuteAll;
 end;
 | 
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 3:47 pm    Assunto: |   |  
				| 
 |  
				| Se você executar essa consulta que está dentro do exists no IBExpert ou ferramenta semelhante, ela retorna alguma coisa? |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 4:30 pm    Assunto: |   |  
				| 
 |  
				| Eu quis dizer esse trecho abaixo: 
 
  	  | Código: |  	  | select * from rdb$indices as i inner join rdb$index_segments as s on i.rdb$index_name = s.rdb$index_name
 where i.rdb$unique_flag = 1 and i.rdb$relation_name = 'Tabela' and s.rdb$field_name = 'Campo'
 | 
 
 Se você executar essa consulta no IBExpert, ela retorna alguma coisa?
 Se ela por algum motivo não retornar nada, poderíamos entender porque o "Alter Table" está sendo executado, e indicaria o trecho do script que estaria precisando ser analisado com mais detalhes.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 4:34 pm    Assunto: |   |  
				| 
 |  
				|  	  | imex escreveu: |  	  | Eu quis dizer esse trecho abaixo: 
 
  	  | Código: |  	  | select * from rdb$indices as i inner join rdb$index_segments as s on i.rdb$index_name = s.rdb$index_name
 where i.rdb$unique_flag = 1 and i.rdb$relation_name = 'Tabela' and s.rdb$field_name = 'Campo'
 | 
 
 Se você executar essa consulta no IBExpert, ela retorna alguma coisa?
 Se ela por algum motivo não retornar nada, poderíamos entender porque o "Alter Table" está sendo executado, e indicaria o trecho do script que estaria precisando ser analisado com mais detalhes.
 | 
 
 Não esta retornando nada. Tudo null
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Jan 20, 2021 4:45 pm    Assunto: |   |  
				| 
 |  
				| Se você acha suficiente fazer a consulta somente pelo nome do índice, pode utilizar aquela consulta separada que você usou para ver se o índice já existe dentro do "Not Exists". Sobre essa consulta que sugeri, acho que você teria que deixar de repente só o nome da tabela no Where para ver o que vai retornar e verificar qual filtro está fazendo com que não seja retornado nada.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		|  |