AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 41689
Accepted
kyooryu
kyooryu
Asked: 2013-05-08 06:24:10 +0800 CST2013-05-08 06:24:10 +0800 CST 2013-05-08 06:24:10 +0800 CST

É possível validar declarações DML?

  • 772

Suponha que eu queira excluir um usuário chamado 'abc cba' do banco de dados. Então eu executo a seguinte consulta:

DELETE FROM table WHERE fname = 'abc' AND last name = 'cba'; commit;

Agora, pode haver mais usuários com esse nome que eu não conheço. A escolha óbvia seria executar a instrução select de antemão e verificar se estou excluindo o que realmente queria excluir, mas ainda sou humano e posso esquecer isso e acabar procurando backups para recuperar dados perdidos.

Minha pergunta é: existe uma maneira de impor certas regras às instruções após as quais elas não executarão a instrução DML (por exemplo, não execute a exclusão se o número de linhas excluídas exceder determinado limite)?

dml
  • 2 2 respostas
  • 753 Views

2 respostas

  • Voted
  1. Thomas Stringer
    2013-05-08T06:36:17+08:002013-05-08T06:36:17+08:00

    Só posso falar pelo SQL Server, mas a única maneira de fazer isso é por meio de um gatilho DML (tanto quanto sei). Veja abaixo como exemplo:

    use TestDB;
    go
    
    create table dbo.TestTriggerTable
    (
        id int identity(1, 1) not null,
        some_int int not null
            default 1
    );
    go
    
    insert into dbo.TestTriggerTable
    default values;
    go 1000
    
    create trigger DeleteMaxRows
    on dbo.TestTriggerTable
    after delete
    as
    
        if (select count(*) from deleted) > 10
        begin
            raiserror('Cannot delete more than 10 rows', 16, 1);
            rollback;
        end
    go
    
    select *
    from dbo.TestTriggerTable;
    
    -- this fails and rolls back
    delete from dbo.TestTriggerTable
    where id < 20;
    go
    
    -- this is successful
    delete from dbo.TestTriggerTable
    where id < 8;
    go
    

    Porém, existem alguns problemas com essa abordagem e não acredito que seja um bom design. Em primeiro lugar, você tem requisitos codificados dentro do gatilho (se você está fazendo uma contagem de linhas definida ou uma porcentagem de linhas... ainda é codificado). Um aplicativo teria que ser projetado de acordo para garantir a repetição com uma lógica diferente.

    O que realmente importa é ter um banco de dados projetado corretamente e instruções DML construídas corretamente para garantir que os dados que estão sendo modificados sejam os dados que você deseja, em vez de ter que verificar uma contagem de linhas das linhas excluídas.

    Na minha opinião, você deve gastar tempo de design para descobrir como redesenhar para não precisar dessa verificação.

    • 5
  2. Best Answer
    a1ex07
    2013-05-08T06:36:31+08:002013-05-08T06:36:31+08:00

    A imposição de tais regras no nível do banco de dados pode ser muito cara em termos de recursos, então não acho que exista uma maneira padrão que funcione em todos os lugares.

    Não posso sugerir nada melhor do que gerar um erro dentro do corpo da BEFORE DELETEtrigger (ou AFTER DELETE, mas BEFOREtrigger parece ser mais apropriado nesse caso). Infelizmente, é bastante dependente do RDMS. Por exemplo, no Oracle, se você deseja acessar a mesma tabela dentro do gatilho, você precisa usar o gatilho de nível de instrução; SQLServer chama tais gatilhos INSTEAD OF, não BEFORE.

    • 3

relate perguntas

  • Encontrar registros de exclusão ou atualização

  • Por que uma instrução UPDATE SET REPLACE() corresponderia às linhas, mas não alteraria nenhuma e não forneceria avisos?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve