locked
Concatenar String em um campo com relacionamento em outras tabelas RRS feed

  • Pergunta

  • Boa Tarde, Pessoal

    Preciso fazer um update em um campo que possui relacionamento em várias tabelas, concatenando '00000' + o conteúdo desse campo em todas as tabelas que ele está relacionado.
    Alguém pode me ajudar?

    Obrigado
    Roosevelt
    segunda-feira, 27 de abril de 2009 18:43

Respostas

  • Caro, 

     Se a constraint foi criada com o cascade, opção de update, então basta você atualizar. Caso não, você terá que recriar (alterar) essa constraint para definir essa opção.  Faça backup de tudo antes.

    Abraços
    Gilberto Neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    • Sugerido como Resposta Gilberto Neto segunda-feira, 27 de abril de 2009 18:50
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 14:17
    segunda-feira, 27 de abril de 2009 18:50
  • Roosevelt,


    Se eu entendi, vc que alterar um valor em uma chave primaria, e que este valor também seja atualizado em todas as ocorrências desta chave em outras tabelas que tem este campo como chave estrangeira?

    A maneira mais simples de fazer isto é alterar a propriedade "Update Rule" para "CASCADE" de todos os relacionamentos com esta chave primaria. O SQLServer vai atualizar automaticamente qualquer alteração nesta chave em todas as dependencias.


    Ismael Monteiro da Silva
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 14:17
    segunda-feira, 27 de abril de 2009 18:55
  • Olá Gilberto,

    Acredito que o Cascade seja melhor opção ainda que para ativá-la seja necessário dropar e reconstruir a constraint (mesmo via ferramenta gráfica é isso que irá acontecer). Isso pode incorrer em algum tempo dependendo da quantidade de registros e verificações a ser feitas. Desabilitar a constraint pode ser mais rápido e a ativação pode ser feita em etapa posterior. Vide script.

    -- Cria as tabelas
    CREATE TABLE T1 (IDT1 CHAR(10) NOT NULL,
    	CONSTRAINT PKT1 PRIMARY KEY (IDT1))
    	
    CREATE TABLE T2 (IDT2 INT, IDT1 CHAR(10),
    	CONSTRAINT FKT1 FOREIGN KEY (IDT1) REFERENCES T1 (IDT1))
    
    -- Insere registros
    INSERT INTO T1 VALUES ('123456')
    INSERT INTO T2 VALUES (1,'1234562')
    
    -- Tenta atualizar o registro em T1 (Um erro ocorre)
    UPDATE T1 SET IDT1 = '0000' + IDT1
    
    -- Desabilita as Constraint "FK"
    ALTER TABLE T2 NOCHECK CONSTRAINT FKT1
    
    -- Tenta atualizar o registro em T1 (Dessa vez sem erros)
    UPDATE T1 SET IDT1 = '0000' + IDT1
    UPDATE T2 SET IDT1 = '0000' + IDT1
    
    -- Ativa novamente a FK
    ALTER TABLE T2 CHECK CONSTRAINT FKT1

    Só que manter a constraint desabilitada abre margem a outros problemas... Por isso o Cascade como você citou é a melhor opção.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 13:46
    terça-feira, 28 de abril de 2009 01:19

Todas as Respostas

  • Caro, 

     Se a constraint foi criada com o cascade, opção de update, então basta você atualizar. Caso não, você terá que recriar (alterar) essa constraint para definir essa opção.  Faça backup de tudo antes.

    Abraços
    Gilberto Neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    • Sugerido como Resposta Gilberto Neto segunda-feira, 27 de abril de 2009 18:50
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 14:17
    segunda-feira, 27 de abril de 2009 18:50
  • Roosevelt,


    Se eu entendi, vc que alterar um valor em uma chave primaria, e que este valor também seja atualizado em todas as ocorrências desta chave em outras tabelas que tem este campo como chave estrangeira?

    A maneira mais simples de fazer isto é alterar a propriedade "Update Rule" para "CASCADE" de todos os relacionamentos com esta chave primaria. O SQLServer vai atualizar automaticamente qualquer alteração nesta chave em todas as dependencias.


    Ismael Monteiro da Silva
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 14:17
    segunda-feira, 27 de abril de 2009 18:55
  • Boa Tarde,

    A menos que o Update Cascade esteja habilitado você terá que excluir todos os relacionamentos, fazer os UPDATEs (na tabela e suas filhas) e refazer os relacionamentos. Caso você não opte por excluir os relacionamentos você pode provisoriamente desabilitá-los.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 27 de abril de 2009 19:27
  • Gustavo,

     Agora você me pegou, rs... Se caso o cascade update não esteja ativo, ele não poderia excluir e criar com essa opção?

    Abraços
    Gilberto Neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    • Sugerido como Resposta Gilberto Neto segunda-feira, 27 de abril de 2009 20:08
    segunda-feira, 27 de abril de 2009 20:07
  • Olá Gilberto,

    Acredito que o Cascade seja melhor opção ainda que para ativá-la seja necessário dropar e reconstruir a constraint (mesmo via ferramenta gráfica é isso que irá acontecer). Isso pode incorrer em algum tempo dependendo da quantidade de registros e verificações a ser feitas. Desabilitar a constraint pode ser mais rápido e a ativação pode ser feita em etapa posterior. Vide script.

    -- Cria as tabelas
    CREATE TABLE T1 (IDT1 CHAR(10) NOT NULL,
    	CONSTRAINT PKT1 PRIMARY KEY (IDT1))
    	
    CREATE TABLE T2 (IDT2 INT, IDT1 CHAR(10),
    	CONSTRAINT FKT1 FOREIGN KEY (IDT1) REFERENCES T1 (IDT1))
    
    -- Insere registros
    INSERT INTO T1 VALUES ('123456')
    INSERT INTO T2 VALUES (1,'1234562')
    
    -- Tenta atualizar o registro em T1 (Um erro ocorre)
    UPDATE T1 SET IDT1 = '0000' + IDT1
    
    -- Desabilita as Constraint "FK"
    ALTER TABLE T2 NOCHECK CONSTRAINT FKT1
    
    -- Tenta atualizar o registro em T1 (Dessa vez sem erros)
    UPDATE T1 SET IDT1 = '0000' + IDT1
    UPDATE T2 SET IDT1 = '0000' + IDT1
    
    -- Ativa novamente a FK
    ALTER TABLE T2 CHECK CONSTRAINT FKT1

    Só que manter a constraint desabilitada abre margem a outros problemas... Por isso o Cascade como você citou é a melhor opção.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta RooseveltSJr quarta-feira, 29 de abril de 2009 13:46
    terça-feira, 28 de abril de 2009 01:19
  • Ahhh, blza...pensei que vc tinha dito que não funcionaria. risos.  Realmente se for apenas 1 tabela, até que a sua solução seja boa, pela performance, inclusive. Mas se forem muitas, ai a complexidade e o controle tem que ser maior.  E sim, constraint, mesmo alteração, vai ocorrer o drop e o recreate... isso na maioria dos bancos, não apenas no SQL Server.

    Abraços
    Gilberto neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    terça-feira, 28 de abril de 2009 09:32
  • Pessoal,

    Muito Obrigado pela atenção, fiz a alteração na propriedade "Update Rule" para "CASCADE" e realizei o update, alterou todas as dependências corretamente, vou dar uma última verificada para realizar os mesmos passos na base oficial.
    Conhecem algum link com uma boa apostila de SQL Server?

    Att.
    Roosevelt
    quarta-feira, 29 de abril de 2009 14:23
  • Caro,

     Acredito que a melhor documentação do SQL Server, seja o books on line mesmo.

    Abraços
    Gilberto Neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    quarta-feira, 29 de abril de 2009 14:38
  • Bom Dia,

    Eu recomendaria procurar pelos programas MSDN Experience e TechNet Experience.
    Esses programas consistem em uma série de vídeos gratuitos que vão desde o nível básico até o mais avançado sobre o SQL Server.
    Ele é gratuito e está disponível em português. Você pode encontrá-los no site da Microsoft ou procure nos posts anteriores.

    Como o assunto "apostila" não está relacionado a concatenação de strings, entendo que o post está resolvido.
    Estarei bloqueando-o para que o assunto do post não desfoque.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 29 de abril de 2009 15:00