none
comando update alterar registros em tabelas referenciadas

    Question

  • Ola pessoal

     

    gostaria de saber se tem algum recurso do proprio SGBD para alterar os registros em todas as tabelas que fazem referencia?

     

    Exemplo:

    - Alterar o codigo de um cliente

    esse cliente tem: notas fiscais, pedidos, incrições estaduais, etc etc etc,

    Enfim, varias registros em outras tabelas que fazem referencia a esse cliente que deve ser alterado.

     

    Se tiver feitos os relacionamentos certinhos, a principio o BD não me deixaria dar UPDATE no registro né?

    Assim como tem uma forma de DELETE em cascata, não algo semelhante para o UPDATE, para alterar o registro em todas as tabelas que fazem referencia a clientes?

     

     

    obrigado!


    Julio C.
    Friday, November 25, 2011 2:19 PM

Answers

  • Boa Tarde,

    Assim como existe a exclusão em cascata existe a atualização em cascata. Basta configurar sua FK para isso (se já estiver criada será necessário recriá-la). Segue um exemplo da utilização

    -- Cria uma tabela de pessoas
    CREATE TABLE Pessoas (ID INT NOT NULL, Nome VARCHAR(50) NOT NULL)

    -- Cria uma tabela de telefones
    CREATE TABLE Telefones (Numero CHAR(8) NOT NULL, DDD CHAR(3) NOT NULL, ID INT NOT NULL)

    -- Cria as constraints
    ALTER TABLE Pessoas ADD CONSTRAINT PK_Pessoa PRIMARY KEY (ID)
    ALTER TABLE Telefones ADD CONSTRAINT PK_Telefone PRIMARY KEY (Numero, DDD)

    ALTER TABLE Telefones ADD CONSTRAINT FK_Telefone_Pessoa FOREIGN KEY
     (ID) REFERENCES Pessoas (ID)
     
    -- Insere uma pessoa e um telefone
    INSERT INTO Pessoas VALUES (1, 'Zé')
    INSERT INTO Telefones VALUES ('92148551','099',1)

    -- Tenta alterar o ID da pessoa
    UPDATE Pessoas SET ID = 2 WHERE ID = 1

    -- Mata a FK
    ALTER TABLE Telefones DROP CONSTRAINT FK_Telefone_Pessoa

    -- Recria com atualização em cascata
    ALTER TABLE Telefones ADD CONSTRAINT FK_Telefone_Pessoa FOREIGN KEY
     (ID) REFERENCES Pessoas (ID) ON UPDATE CASCADE

    -- Tenta alterar o ID da pessoa
    UPDATE Pessoas SET ID = 2 WHERE ID = 1

    -- Verifica o resultado
    SELECT * FROM Pessoas
    SELECT * FROM Telefones

    -- Exclui os objetos
    DROP TABLE Telefones
    DROP TABLE Pessoas

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    Friday, November 25, 2011 3:44 PM
  • Boa Tarde,

    O SQL Server 2000 tem apenas o NOACTION e o CASCADE (utilizado no exemplo). O 2005 tem o SET DEFAULT e o SET NULL (pouco utilizados). No 2000 você já consegue fazer. Entretanto, a tabela em questão não pode ter triggers Instead Of.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marked as answer by Julio C. _ Tuesday, November 29, 2011 12:11 PM
    Friday, November 25, 2011 8:31 PM

All replies

  • Boa Tarde,

    Assim como existe a exclusão em cascata existe a atualização em cascata. Basta configurar sua FK para isso (se já estiver criada será necessário recriá-la). Segue um exemplo da utilização

    -- Cria uma tabela de pessoas
    CREATE TABLE Pessoas (ID INT NOT NULL, Nome VARCHAR(50) NOT NULL)

    -- Cria uma tabela de telefones
    CREATE TABLE Telefones (Numero CHAR(8) NOT NULL, DDD CHAR(3) NOT NULL, ID INT NOT NULL)

    -- Cria as constraints
    ALTER TABLE Pessoas ADD CONSTRAINT PK_Pessoa PRIMARY KEY (ID)
    ALTER TABLE Telefones ADD CONSTRAINT PK_Telefone PRIMARY KEY (Numero, DDD)

    ALTER TABLE Telefones ADD CONSTRAINT FK_Telefone_Pessoa FOREIGN KEY
     (ID) REFERENCES Pessoas (ID)
     
    -- Insere uma pessoa e um telefone
    INSERT INTO Pessoas VALUES (1, 'Zé')
    INSERT INTO Telefones VALUES ('92148551','099',1)

    -- Tenta alterar o ID da pessoa
    UPDATE Pessoas SET ID = 2 WHERE ID = 1

    -- Mata a FK
    ALTER TABLE Telefones DROP CONSTRAINT FK_Telefone_Pessoa

    -- Recria com atualização em cascata
    ALTER TABLE Telefones ADD CONSTRAINT FK_Telefone_Pessoa FOREIGN KEY
     (ID) REFERENCES Pessoas (ID) ON UPDATE CASCADE

    -- Tenta alterar o ID da pessoa
    UPDATE Pessoas SET ID = 2 WHERE ID = 1

    -- Verifica o resultado
    SELECT * FROM Pessoas
    SELECT * FROM Telefones

    -- Exclui os objetos
    DROP TABLE Telefones
    DROP TABLE Pessoas

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    Friday, November 25, 2011 3:44 PM
  • Muito legal!! Eu tava desinformado mesmo em relação a isso

     

    só por curiosidade, tem esse recurso no sql 2000?


    Julio C.
    Friday, November 25, 2011 8:13 PM
  • Boa Tarde,

    O SQL Server 2000 tem apenas o NOACTION e o CASCADE (utilizado no exemplo). O 2005 tem o SET DEFAULT e o SET NULL (pouco utilizados). No 2000 você já consegue fazer. Entretanto, a tabela em questão não pode ter triggers Instead Of.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marked as answer by Julio C. _ Tuesday, November 29, 2011 12:11 PM
    Friday, November 25, 2011 8:31 PM