none
Não permitir alteração de um único registro RRS feed

  • Pergunta

  • Bom dia. Tenho uma tabela simples com codigo e descrição, vou dar um exemplo como se fosse cadastro de cores só pra ficar mais facil o entendimento.

    1 - Rosa

    2 - Azul

    3 - Vermelho

    4 - Outras

    Essa tabela pode ser acessada pelo usuário para cadastrar outras cores. Pode parecer sem necessidade ter o registro "Outras", visto que o usuário poderia cadastrar mais cores caso fosse necessário, mas por questões administrativas aqui, foi assim que ficou definido.

    Minha situação é a seguinte: Preciso que o usuário possa editar todos os registro, exceto esse registro "Outras". Ele pode adicionar registros, deletar, alterar, porém esse registro "Outras" , ele pode apenas visualizar, não pode apagar nem editar. Tem como fazer isso?

    Grata

     
    segunda-feira, 20 de julho de 2020 14:27

Todas as Respostas

  • Boa tarde, 

    Não sei se entendi...

    O acesso a essa tabela será via aplicação, se sim, vc pode criar uma view e colocar na cláusula where <> 'outras'



    • Editado Edvaldo A segunda-feira, 20 de julho de 2020 16:11 correção
    segunda-feira, 20 de julho de 2020 16:09
  • Boa tarde,

    LaraW, acho que uma alternativa seria a criação de um gatilho do tipo Instead Of com código para verificar se essa linha foi editada, gerando um erro para impedir a operação se for o caso. Ex:

    CREATE TRIGGER [dbo].[TabelaCoresInsteadOf] ON [dbo].TabelaCores
    INSTEAD OF INSERT, UPDATE, DELETE
    AS
    IF EXISTS (SELECT *
               FROM inserted AS i 
               WHERE i.Descricao = 'Outras'
              ) OR
       EXISTS (SELECT *
               FROM deleted AS d 
               WHERE d.Descricao = 'Outras'
              )
      BEGIN
        RAISERROR ('Essa linha "Outras" não pode ser editada', 16, 1);
      END;
    GO

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 20 de julho de 2020 18:14
  • Boa tarde,

    LaraW, acho que uma alternativa seria a criação de um gatilho do tipo Instead Of com código para verificar se essa linha foi editada, gerando um erro para impedir a operação se for o caso. Ex:

    CREATE TRIGGER [dbo].[TabelaCoresInsteadOf] ON [dbo].TabelaCores
    INSTEAD OF INSERT, UPDATE, DELETE
    AS
    IF EXISTS (SELECT *
               FROM inserted AS i 
               WHERE i.Descricao = 'Outras'
              ) OR
       EXISTS (SELECT *
               FROM deleted AS d 
               WHERE d.Descricao = 'Outras'
              )
      BEGIN
        RAISERROR ('Essa linha "Outras" não pode ser editada', 16, 1);
      END;
    GO

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    LaraW,

    Seguindo nesta linha de raciocínio do Gapimex, você poderia através da Trigger implementar um bloco transacional, e caso realmente venha a ocorrer um Update neste registro, aplicar o Rollback do Update.

    Há um tempo, implementei em um cliente, um cenário parecido com o seu, mas que na verdade faziamos uso de uma coluna de Status para justamente verificar de acordo com a valor dela se o registro poderia ou não ser Atualizado ou até mesmo Excluído.

    Você já pensou em algo similar a este tipo de implementação? Como não conheço seu cenário, não posso afirmar que esta venha a ser a melhor solução, ou até mesmo o quanto poderá impactar em mudanças no seu ambiente.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 20 de julho de 2020 18:58