Table Update Update Doubt

2

I have two tables, questions and answers, and I would like to update them according to what is selected: Bank Sql Server 2005

Problem:

--usuário excluindo a pergunta (não está gravando a data da exclusão é não está excluindo as perguntas)
update TB_PERGUNTA set EXCLUIR_PERGUNTA = 'S' where IDPERGUNTA = 4 and IDUSUARIO = 1


--moderador excluindo a pergunta (não está gravando a data da exclusão é não está excluindo as perguntas)
update TB_PERGUNTA set BLOQUEIO_PERGUNTA = 'S' where IDPERGUNTA = 4 and IDMODERADOR = 7
Create table [TB_PERGUNTA]
(
    [IDPERGUNTA] Integer NOT NULL, UNIQUE ([IDPERGUNTA]),
    [IDCATEGORIA] Integer NOT NULL,
    [IDUSUARIO] Integer NOT NULL,
    [IDMODERADOR] Integer NOT NULL,
    [TITULO_PERGUNTA] Text NULL,
    [DESCRICAO_PERGUNTA] Text NULL,
    [BLOQUEIO_PERGUNTA] Char(1) NULL,
    [DESCRICAO_BLOQUEIO] Text NULL,
    [EXCLUIR_PERGUNTA] Char(1) NULL,
    [DATA_PERGUNTA] Datetime NULL,
    [DATA_EXCLUIR] Datetime NULL,
Primary Key ([IDPERGUNTA])
) 
go

Create table [TB_RESPOSTA]
(
    [IDRESPOSTA] Integer NOT NULL, UNIQUE ([IDRESPOSTA]),
    [IDPERGUNTA] Integer NOT NULL,
    [IDUSUARIO] Integer NOT NULL,
    [IDMODERADOR] Integer NOT NULL,
    [RESPOSTA] Text NULL,
    [RESPOSTA_SELECIONADA] Char(1) NULL,
    [NOTA_RESPOSTA] Numeric(3,2) NULL,
    [BLOQUEIO_RESPOSTA] Char(1) NULL,
    [DESCRICAO_BLOQUEIO] Text NULL,
    [DATA_RESPOSTA] Datetime NULL,
    [DATA_EXCLUIR] Datetime NULL,
Primary Key ([IDRESPOSTA],[IDPERGUNTA])
) 
go

I have the Trigger:

--gatilho para atualiza a tabela de pergunta é resposta no caso de exclusão pelo usuário
--ou pelo moderador
CREATE TRIGGER TGR_TB_PERGUNTA_UPDATE
 ON [dbo].[TB_PERGUNTA]
 FOR UPDATE
AS
BEGIN
   DECLARE @EXCLUIRPERGUNTA CHAR
   DECLARE @BLOQUEIOPERGUNTA CHAR
   DECLARE @IDPERGUNTA INT
   DECLARE @IDUSUARIO INT
   DECLARE @IDMODERADOR INT

   --se o excluirpergunta receber (S) então o usuário está bloqueando a pergunta se (N) está abrindo a pergunta
   SELECT  @EXCLUIRPERGUNTA  = EXCLUIR_PERGUNTA  FROM TB_PERGUNTA INSERTED
   --se o bloqueiopergunta receber (S) então o moderador está bloqueando a pergunta se (N) está abrindo a pergunta
   SELECT  @BLOQUEIOPERGUNTA = BLOQUEIO_PERGUNTA FROM TB_PERGUNTA INSERTED
   --pega o ID da pergunta
   SELECT  @IDPERGUNTA       = IDPERGUNTA        FROM TB_PERGUNTA INSERTED
   --pega o id do usuário
   SELECT  @IDUSUARIO        = IDUSUARIO         FROM TB_PERGUNTA INSERTED
   --pega o id do moderador
   SELECT  @IDMODERADOR      = IDMODERADOR       FROM TB_PERGUNTA INSERTED   

    --pergunta excluida pelo usuário 
   IF ( @EXCLUIRPERGUNTA = 'S')
    BEGIN
      --excluir a pergunta
     UPDATE TB_PERGUNTA  SET  EXCLUIR_PERGUNTA = 'S', 
            DESCRICAO_BLOQUEIO = 'Excluido pelo usuário' ,
            DATA_EXCLUIR = CONVERT(VARCHAR, GETDATE(), 20)
            WHERE IDPERGUNTA = @IDPERGUNTA AND IDUSUARIO =  @IDUSUARIO 

          --excluir todas as respostas referente a pergunta
     UPDATE TB_RESPOSTA SET BLOQUEIO_RESPOSTA = 'S', 
            DATA_EXCLUIR = CONVERT(VARCHAR, GETDATE(), 20),
            DESCRICAO_BLOQUEIO = 'Excluido pelo usuário'  WHERE IDPERGUNTA = @IDPERGUNTA          
    END

    --pergunta bloqueada pelo moderador
   IF ( @BLOQUEIOPERGUNTA = 'S')
    BEGIN
     --excluir pergunta
     UPDATE TB_PERGUNTA  SET BLOQUEIO_PERGUNTA = 'S', 
          DESCRICAO_BLOQUEIO = 'Está pergunta foi bloqueada pelo moderador',  
          DATA_EXCLUIR = CONVERT(VARCHAR, GETDATE(), 20)
          WHERE IDPERGUNTA = @IDPERGUNTA AND IDMODERADOR =  @IDMODERADOR

          --excluir respostas
     UPDATE TB_RESPOSTA SET BLOQUEIO_RESPOSTA = 'S', 
         DATA_EXCLUIR = CONVERT(VARCHAR, GETDATE(), 20),
         DESCRICAO_BLOQUEIO = 'Excluido pelo moderador'  
         WHERE IDPERGUNTA = @IDPERGUNTA  

    END

    --pergunta aberta pelo usuário 
   IF ( @EXCLUIRPERGUNTA = 'N')
    BEGIN
      --pergunta aberta pelo usuário 
     UPDATE TB_PERGUNTA  SET  EXCLUIR_PERGUNTA = 'N', 
            DESCRICAO_BLOQUEIO = 'Excluido pelo usuário' , 
            DATA_EXCLUIR = null
            WHERE IDPERGUNTA = @IDPERGUNTA 
            AND IDUSUARIO =  @IDUSUARIO  

       --abre todas as respostas    
     UPDATE TB_RESPOSTA SET BLOQUEIO_RESPOSTA = 'N',
           DATA_EXCLUIR =null,
           DESCRICAO_BLOQUEIO = null 
           WHERE IDPERGUNTA = @IDPERGUNTA          
    END

    --pergunta aberta pelo moderador
   IF ( @BLOQUEIOPERGUNTA = 'N')
    BEGIN
     --abre a pergunta pelo moderador
     UPDATE TB_PERGUNTA  SET BLOQUEIO_PERGUNTA = 'N', 
            DESCRICAO_BLOQUEIO =null, 
            DATA_EXCLUIR =null
            WHERE IDPERGUNTA = @IDPERGUNTA 
            AND IDMODERADOR =  @IDMODERADOR

      --abre todas as respostas pelo moderador
     UPDATE TB_RESPOSTA SET BLOQUEIO_RESPOSTA = 'N', 
           DATA_EXCLUIR = null, 
           DESCRICAO_BLOQUEIO =null  
           WHERE IDPERGUNTA = @IDPERGUNTA  
           AND IDMODERADOR =  @IDMODERADOR  
    END

END
    
asked by anonymous 03.07.2015 / 04:28

1 answer

0

Note that you are generating a recursive with this trigger, see:

If the variable "BLOCKIOPERGUNTA" is set to "S", in this case you will generate an update again in the table so activating the trigger again can cause problems, you need to use the TRIGGER_NESTLEVEL command, which verifies how many times the trigger was executed by itself, follow the example for your trigger:

   DECLARE @EXCLUIRPERGUNTA CHAR
   DECLARE @BLOQUEIOPERGUNTA CHAR
   DECLARE @IDPERGUNTA INT
   DECLARE @IDUSUARIO INT
   DECLARE @IDMODERADOR INT
   --Caso a trigger esteja chamando a si mesma a execução é interrompida com o comando RETURN
   IF ( SELECT TRIGGER_NESTLEVEL ( ) ) >= 2 
     return

   --se o excluirpergunta receber (S) então o usuário está bloqueando a pergunta se (N) está abrindo a pergunta
    
10.09.2015 / 19:46