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 / 858
Accepted
Joril
Joril
Asked: 2011-01-26 00:56:23 +0800 CST2011-01-26 00:56:23 +0800 CST 2011-01-26 00:56:23 +0800 CST

Por que alguns DBMS não permitem a reversão de certas instruções DDL?

  • 772

Recentemente descobri que o MySQL não suporta rollback de DDL como "alter table"... Estando acostumado com o PostgreSQL, isso me pareceu estranho, mas um amigo meu me disse que nem o Oracle permite isso. Existem razões técnicas para não apoiá-lo? É simplesmente um recurso "desinteressante" para eles?

Edit: acabei de encontrar esta comparação . Parece que existem muitos DBMSes que suportam DDL transacional.

ddl feature-comparison
  • 4 4 respostas
  • 3976 Views

4 respostas

  • Voted
  1. Best Answer
    Peter Eisentraut
    2011-01-26T06:18:57+08:002011-01-26T06:18:57+08:00

    A razão pela qual isso funciona no PostgreSQL é que os catálogos do sistema são tabelas regulares. Portanto, criar uma nova função, por exemplo, requer apenas inserir uma linha na pg_proctabela, alterar o valor padrão de uma coluna requer apenas fazer uma atualização em alguma linha em pg_attrdef, e assim por diante. Como as tabelas são transacionais de qualquer maneira, você quase teria que sair do seu caminho para não funcionar dessa maneira. (Muitos detalhes de implementação dolorosos foram omitidos aqui. ;-))

    Suponho, não conhecendo o código-fonte, que outros mecanismos de banco de dados usam algumas estruturas internas personalizadas para representar as informações do catálogo do sistema. E então eles teriam que colocar um esforço extra, muito esforço extra provavelmente, para fazer o DDL transacional funcionar, e aparentemente não é uma prioridade para eles.

    O outro lado disso é que esta é a razão pela qual as atualizações de versões principais do PostgreSQL são tão dolorosas. Outros produtos podem presumivelmente projetar suas estruturas internas de metadados com alterações e atualizações em mente e, portanto, não há problemas com a atualização para uma nova versão principal. No PostgreSQL, não há como alterar uma tabela de catálogo do sistema para repentinamente parecer uma versão mais recente de uma tabela de catálogo do sistema, pelo menos não enquanto mantém o sistema online, porque isso exigiria acesso aos catálogos do sistema. Urgh.

    • 19
  2. KillerDBA
    2011-01-26T14:11:15+08:002011-01-26T14:11:15+08:00

    A maioria não? Desapontamento.

    Eu uso principalmente SQL Server e ele faz. Eu sei que a Oracle não, mas pensei que a Oracle poderia ser uma aberração.

    No SQL Server, tenho certeza de que você pode executar várias instruções DDL em uma única transação, embora também ache que haja algumas restrições (das quais esqueci). Você pode criar, alterar ou descartar a maioria das coisas e revertê-las, se quiser. O Red-Gate SQL Compare (uma ferramenta que adoro) tira proveito disso.

    O problema de fazer isso é que o escopo da transação fica bastante interessante... Ao envolver os catálogos do sistema em uma transação de atualização (DDL), você corre o risco de tomar alguns bloqueios realmente importantes e pode bloquear o acesso aos catálogos do sistema. Os usuários não podem fazer muito se suas consultas não encontrarem suas tabelas nos catálogos!

    Em suma, porém, é útil poder incluir DDL em uma transação de várias instruções.

    Mais útil, o comando SQL Server DDL TRUNCATE também pode ser um elemento de uma transação de várias instruções . Você pode truncar uma tabela de destino (muito rápido), construí-la e, em seguida, fazer um commit se gostar do resultado. Se algo der errado, você reverte e pronto!, é como se você nunca tivesse mexido na mesa. O espaço de registro também é minimizado. Eu aproveito isso com bastante frequência.

    • 10
  3. Marian
    2011-01-26T03:56:12+08:002011-01-26T03:56:12+08:00

    No SQL Server, podemos reverter as instruções DDL, sem usar o auto commit no final da instrução. Em outros SGBDs não sei, mas lembro que no Oracle não dá para fazer o mesmo. Acredito que seja específico de cada SGBD, não sei o que diria o padrão SQL sobre isso, mas tenho certeza que nenhum produtor implementa 100% o padrão.

    Há uma pergunta semelhante no SO: é possível executar várias instruções DDL dentro de uma transação (dentro do SQL Server)?

    • 5
  4. Gary
    2011-01-26T13:03:04+08:002011-01-26T13:03:04+08:00

    O Oracle tem análise de consulta compartilhada, então um SELECT * FROM table_a feito por uma sessão é (normalmente) igual ao de outra sessão. Isso seria interrompido se uma sessão pensasse que havia dez colunas na tabela e outra pensasse que havia onze.

    • 5

relate perguntas

  • Quais mecanismos de banco de dados me permitirão GRANT/REVOKE em uma coluna específica?

  • Quais outros bancos de dados têm um recurso semelhante ao Flashback Query da Oracle?

  • Quando usar NULL e quando usar uma string vazia?

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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