none
Como definir campo para NULL RRS feed

  • Pergunta

  • Boas..

    Tenho duas tabelas e precisava que sempre que um registo de uma delas fosse eliminado um determinado campo da outra, fosse imediatamente colocado com o valor NULL

    No entanto, não sei como fazer isso..
    quarta-feira, 26 de dezembro de 2007 16:41

Respostas

  • Oi Chapolin,

     

    Só tem um detalhezinho. Do jeito que está, a trigger poderá gerar um erro de integridade se houver um relacionamento entre a tabela que tem a trigger e a tabela que terá seus registros atualizados. Nessa situação, pode ser necessário criar um trigger INSTEAD OF ao invés de um trigger comum.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de dezembro de 2007 17:47

Todas as Respostas

  • Boa Tarde Vítor,

     

    Cara, preciso que seja mais específico na sua dúvida. Existe relacionamento entre as tabelas? Se existe o campo não é uma chave estrangeira da outra coluna correto? Esse campo foi criado com um campo NULL, ou seja, permite valores nulos?? Como vc deseja fazer isso?? Por meio de uma procedure ou de uma Trigger?? Em termo de desempenho, aconselho ser um processo na procedure, porém não sei se é uma "exigência ser uma trigger".

    Da uma explicadinha mais detalhada que posso te ajudar de uma forma mais clara..

     

    Abraço,

     

    chapolin.rio@gmail.com

    quarta-feira, 26 de dezembro de 2007 16:54
  • Vitor,

     

    Desculpe-me caso tenha recebido o meu post anterior, acabei me confundindo.

     

    O que você poderia fazer é criar uma trigger for Delete, quando um registro for excluído é disparado um Update fazendo atualização no campo desejado.

     

    Mas gostaria de obter mais informações sobre a sua estrutura de relacionamento?

     

    Em relação a performance o trigger é executado como se fosse um bloco de transação que por padrão o SQL Server dispara assim que a operação ao qual o trigger esta associado é executado.

     

    quarta-feira, 26 de dezembro de 2007 17:02
  •  

    Boas..

    As tabelas têm relacionamento entre si e o campo que eu quero alterar não é chave estrangeira..

    Estou usando o SQL EXpress 2005, o campo permite valor nulos..

     

     

    quarta-feira, 26 de dezembro de 2007 17:04
  • Vitor,

     

    Certo, independemente da versão do SQL Server, você poderia utilizar uma trigger ou então uma procedure!!!

    quarta-feira, 26 de dezembro de 2007 17:12
  • Blz Vitpr,

     

    Meio caminho andando. Agora de que forma vc pretende fazer esse processo!?? Por meio de uma procedure, pode ser a mesma que faz a exclusão do registro em questão ou por uma Trigger?!? A questão de desempenho que comentei anteriormente a respeito da trigger é pq se for uma quantidade significativa de dados com processos o tempo todo o desempenho da trigger cairá em relação a uma procedure. Não seria um crime um trigger, mas se podemos ter um processo menos custoso acho que vale a pena ser levado em consideração. Galera, se estiver errado favor me corrigam!!!

     

    Abraço

     

    chapolin.rio@gmail.com

    quarta-feira, 26 de dezembro de 2007 17:14
  • Como o Código está estruturado tem de ser uma trigger..

    quarta-feira, 26 de dezembro de 2007 17:15
  • Olá Vitor,

     

    Vi sua dúvida na outra comunidade e postei lá a resposta. Imaginei que a coluna a ser atualizada fosse FK e fiz via trigger e via constraint. Você pode adaptar os meus exemplos. Segue o trecho de código referente a trigger:

     

    -- Cria as tabelas

    CREATE TABLE tbl1 (C1 INT PRIMARY KEY)

    CREATE TABLE tbl2 (C2 INT PRIMARY KEY, C1 INT NULL,

    CONSTRAINT FK FOREIGN KEY (C1) REFERENCES tbl1 (C1))

    GO

     

    -- Cria a trigger

    -- INSTEAD OF para não violar a FK

    -- Se não houver FK, pode-se usar a trigger AFTER

    CREATE TRIGGER trg1 ON tbl1

    INSTEAD OF DELETE

    AS

    BEGIN

    UPDATE tbl2 SET C1 = NULL WHERE C1 IN (SELECT C1 FROM DELETED)

    DELETE FROM tbl1 WHERE C1 IN (SELECT C1 FROM DELETED)

    END

    GO

     

    -- Insere registros em Tbl1 e Tbl2

    INSERT INTO Tbl1 VALUES (1)

    INSERT INTO Tbl1 VALUES (2)

    INSERT INTO Tbl2 VALUES (1,1)

    INSERT INTO Tbl2 VALUES (2,1)

    INSERT INTO Tbl2 VALUES (3,2)

    INSERT INTO Tbl2 VALUES (4,2)

     

    -- Confere as tabelas

    SELECT * FROM Tbl1

    SELECT * FROM Tbl2

     

    -- Delete um registro de Tbl1 para testar a trigger

    DELETE FROM Tbl1 WHERE C1 = 1

     

    -- Verifica se o registro foi excluído e se os registros em Tbl2 foram atualizados

    SELECT * FROM Tbl1

    SELECT * FROM Tbl2

     

    -- Exclui as tabelas

    DROP TABLE Tbl2

    DROP TABLE Tbl1

     

    [ ]s,

     

    Gustavo

    quarta-feira, 26 de dezembro de 2007 17:22
  • Vítor,

     

    Abaixo um exemplo de uma trigger de delete. Repare na criação da trigger, ela é um FOR DELETE ou seja, sempre será chamada quando exisitr um deleção. repare que coloco a tabela referente ao processo.

     

    Qualquer dúvida posta aí que ajudo...

     

    Espero ter ajudado,

     

    Abraço,

     

    Chapolin.rio@gmail.com

     

     

    CREATE TRIGGER [dbo].[TriggerDeletePlanejamento] ON [dbo].[sua_tabela_que_sofrera_a_deleção_do_registro]

    FOR DELETE

    AS

     

    DECLARE @DadosAntes AS VARCHAR (3500)

     

    --BUSCANDO INFORMAÇÕES DO INSERT

    SELECT @DadosAntes = CÓDIGO REFERENTE AO REGISTRO EXLUÍDO

    FROM DELETED (NOLOCK)

     

    --ATUALIZANDO TABELA PARA VALOR NULLO

    UPDATE TABELA_QUE_SERA_ATUALIZADA

    SET CAMPO_ATUALIZADO = NULL

    WHERE CHAVE_ESTRANGEIRA = @DadosAntes

    quarta-feira, 26 de dezembro de 2007 17:23
  • Oi Chapolin,

     

    Só tem um detalhezinho. Do jeito que está, a trigger poderá gerar um erro de integridade se houver um relacionamento entre a tabela que tem a trigger e a tabela que terá seus registros atualizados. Nessa situação, pode ser necessário criar um trigger INSTEAD OF ao invés de um trigger comum.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de dezembro de 2007 17:47
  • Gustavo,

     

    Peguei essa.. Obrigado pela correção!!!!

     

    Abraço,

     

    chapolin.rio@gmail.com

    quarta-feira, 26 de dezembro de 2007 18:00