Recentemente eu descobri que o MySQL não suporta reversão de DDL como "alter table" ... Estar acostumado ao PostgreSQL, isso me pareceu estranho, mas um amigo meu me disse que nem o Oracle o permite. Existem razões técnicas para não apoiá-lo? É simplesmente um recurso "desinteressante" para eles?
Edit: acabou de encontrar esta comparação . Parece que há muitas DBMSes que fazer DDL transacional apoio.
DROP
ou umRENAME
?Respostas:
A razão pela qual isso funciona no PostgreSQL é que os catálogos do sistema são tabelas regulares. Portanto, a criação de uma nova função, por exemplo, requer apenas a inserção de uma linha na
pg_proc
tabela, a alteração do valor padrão de uma coluna exige a atualização de alguma linhapg_attrdef
e assim por diante. Como as tabelas são transacionais de qualquer maneira, você quase precisará se esforçar para não funcionar dessa maneira. (Muitos detalhes dolorosos da implementação foram omitidos aqui. ;-))Suponho, sem conhecer o código fonte, que outros mecanismos de banco de dados usem algumas estruturas internas personalizadas para representar suas informações de catálogo do sistema. E, portanto, eles teriam que fazer um esforço extra, muito provavelmente, para fazer o DDL transacional funcionar, e aparentemente não é uma prioridade para eles.
O outro lado disso é que essa é a razão pela qual as principais atualizações de versão do PostgreSQL são tão dolorosas. Presumivelmente, outros produtos podem 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 parecer repentinamente uma versão mais recente de uma tabela de catálogo do sistema, pelo menos não enquanto o sistema estiver online, pois isso exigiria acesso aos catálogos do sistema. Urgh.
fonte
A maioria não? Vadio.
Eu uso principalmente o SQL Server e ele faz. Eu sei que a Oracle não, mas achei 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 eu também pense que há algumas restrições (que eu esqueci). Você pode criar ou alterar ou soltar a maioria das coisas e revertê-la, se quiser. O Red-Gate SQL Compare (uma ferramenta que eu amo) tira proveito disso.
O problema é que o escopo da transação se torna bastante interessante ... Quando você envolve os catálogos do sistema em uma transação de atualização (DDL), corre o risco de realizar 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!
No entanto, é útil poder incluir DDL em uma transação com várias instruções.
Mais útil, o comando DDL do SQL Server
TRUNCATE
também pode ser um elemento de uma transação com várias instruções . Você pode truncar uma tabela de destino (muito rápido), compilá-la e, em seguida, fazer uma confirmação se desejar o resultado. Se algo der errado, você reverte e pronto !, é como se você nunca tivesse perturbado a mesa. O espaço do log também é minimizado. Aproveito isso com bastante frequência.fonte
TRUNCATE
que não poderia ser revertido. Eu estava errado.No SQL Server, podemos reverter as instruções DDL, não está usando a confirmação automática no final da instrução. Em outros DBMS eu não sei, mas lembro que no Oracle não se pode fazer o mesmo. Acredito que seja específico para cada DBMS, não tenho certeza do que o padrão SQL diria sobre isso, mas tenho certeza de que nenhum produtor implementa 100% do padrão.
Há uma pergunta semelhante no SO: é possível executar várias instruções DDL dentro de uma transação (no SQL Server)?
fonte
O Oracle compartilhou a análise de consultas, portanto, um SELECT * FROM table_a feito por uma sessão é (normalmente) o mesmo que o de outra sessão. Isso seria interrompido se uma sessão pensasse que havia dez colunas na tabela e outra pensasse que havia onze.
fonte