Impedindo Alterações na Tabela – SQL Server


 

A segurança dos dados é algo vital para qualquer empresa, dessa forma é importante evitar que constrangimentos ocorram com execução de scripts.

Uma necessidade que algumas vezes o DBA precisará recorrer é evitar acessos e operações indevidas ou equivocadas, que até mesmo o próprio DBA pode acabar tendo um descuido e executar uma operação errada. Vamos ver nesse post, algumas soluções utilizando triggers.

 

Tabela que irá ser bloqueada evitando assim alterações DML , tornando-se apenas “read-only”

 

No exemplo abaixo vamos usar uma trigger para evitar que registros sejam excluídos, inseridos ou deletados na tabela [dbo].[PESSOA]

 

Resultado da execução do Delete:

 

Resultado da execução de Update:

 

Resultado da execução de Insert:

 

PREVENINDO UPDATE E DELETE SEM A CLAÚSULA WHERE

Um erro muito comum no dia a dia do DBA, é quando algum analista ou desenvolvedor envia um script de UPDATE ou DELETE para o DBA executar e eles esquecem de colocar a cláusula WHERE. Imaginem o estrago que isso pode gerar no banco de dados.. Uma forma de evitar isso, é utilizando plugins e add-ons, como Redgate SQL Prompt e AplexSQL Complete, que alertam o DBA quando isso vai ocorrer.

No entanto são ferramentas que precisam de uma licença, uma outra forma é criando uma trigger, como verá baixo:

Execução de Delete

Execução de Update

 

Com base nesses exemplos pode-se implementar para outras finalidades como por exemplo, utilizando IF.. ELSE, para determinar que se tal produto for inserido, ele não irar entrar na tabela.

 

Espero que tenham gostado.

Abraços e até mais. 🙂

 

SCRIPT

// Trigger que bloqueia DML

CREATE TRIGGER [dbo].[trgBloqueia_tbPessoa] ON [dbo].[PESSOA]
FOR INSERT, UPDATE, DELETE AS
BEGIN

IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (‘Operações de INSERT não é permitido na tabela “[dbo].[PESSOA]”‘, 15, 1);
RETURN;
END

IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted)
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (‘Operações de DELETE não é permitidas na tabela “[dbo].[PESSOA]”‘, 15, 1);
RETURN;
END

IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (‘Operações de UPDATE não é permitido na tabela “[dbo].[PESSOA]”‘, 15, 1);
RETURN;
END

END;

 

// Trigger que impede Delete e Update sem cláusula WHERE

IF (OBJECT_ID(‘[dbo].[alteracao_sem_where]’) IS NOT NULL) DROP TRIGGER [dbo].[alteracao_sem_where]
GO

CREATE TRIGGER [dbo].[alteracao_sem_where] ON [dbo].[PESSOA]
FOR UPDATE, DELETE AS
BEGIN

DECLARE
@Qtd_Linhas_Alteradas INT = @@ROWCOUNT,
@Qtd_Linhas_Tabela INT = (SELECT SUM(row_count) FROM sys.dm_db_partition_stats WHERE [object_id] = OBJECT_ID(‘[dbo].[PESSOA]’) AND (index_id <= 1))

IF (@Qtd_Linhas_Alteradas >= @Qtd_Linhas_Tabela)
BEGIN
ROLLBACK TRANSACTION;
RAISERROR (‘DELETE e/ou UPDATE sem cláusula WHERE não é permitida na tabela “[dbo].[PESSOA]”‘, 15, 1);
RETURN;
END
END;
GO

Share on FacebookTweet about this on TwitterShare on LinkedIn


Escreva um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *