web-dev-qa-db-fra.com

Pourquoi certains DBMS ne permettent pas la restauration de certaines déclarations DDL?

Récemment, j'ai découvert que mysql non Supporte la restauration de DDL telle que "Alter Table" ... étant habitué à postgresql, qui m'a frappé comme impair, mais un de mes amis m'a dit que même Oracle Ne le permettez pas. Y a-t-il des raisons techniques de ne pas le soutenir? Est-ce simplement une fonctionnalité "inintéressante" pour eux?

EDIT: Il suffit de trouver cette comparaison . On dirait qu'il y a beaucoup de dbmses qui font support DDL transactionnel.

21
Joril

La raison pour laquelle cela fonctionne dans PostgreSQL est que les catalogues système sont des tables régulières. Donc, créer une nouvelle fonction, par exemple, nécessite simplement l'insertion d'une ligne dans le pg_proc Tableau, la modification de la valeur par défaut d'une colonne nécessite simplement de faire une mise à jour de certaines lignes dans pg_attrdef, etc. Étant donné que les tables sont transactionnelles quand même, vous devrez presque vous échapper de ne pas le faire fonctionner de cette façon. (Beaucoup de détails de mise en œuvre douloureux omis ici. ;-))

Je suppose, sans connaître le code source, que d'autres moteurs de base de données utilisent des structures internes personnalisées pour représenter leurs informations de catalogue système. Et ils devraient donc faire des efforts supplémentaires, beaucoup d'efforts supplémentaires susceptibles de faire des travaux de DDL transactionnels, et il n'est apparemment pas une priorité pour eux.

Le côté bascule est que c'est la raison pour laquelle les mises à niveau de la version majeures de PostgreSQL sont si douloureuses. D'autres produits peuvent probablement concevoir leurs structures de métadonnées internes avec des modifications et des mises à jour à l'esprit, et il n'ya donc aucun problème à la mise à niveau vers une nouvelle version majeure. Dans PostgreSQL, il n'ya aucun moyen de modifier une table de catalogue système pour ressembler soudainement une version plus récente d'une table de catalogue système, du moins pas tout en conservant le système en ligne, car cela nécessiterait un accès aux catalogues système. Urgh.

19
Peter Eisentraut

La plupart pas? Dommage.

J'utilise principalement SQL Server et ça fait. Je connais Oracle, mais je pensais que Oracle pourrait être une aberration.

Dans SQL Server, je suis tout à fait sûr que vous pouvez exécuter plusieurs déclarations DDL dans une seule transaction, bien que je pense aussi qu'il y a quelques restrictions (que j'ai toutes oublées). Vous pouvez faire une création ou une goutte de la plupart des choses et de le faire rouler, si vous le souhaitez. Red-Gate SQL Comparer (un outil que j'aime) en profite.

Le problème avec cela est que votre champ de transaction devienne assez intéressante ... Lorsque vous impliquez les catalogues système dans une transaction de mise à jour (DDL), vous risquez de prendre des verrous vraiment importants et que vous pouvez bloquer l'accès aux catalogues système. Les utilisateurs ne peuvent pas faire beaucoup si leurs requêtes ne peuvent pas trouver leurs tables dans les catalogues!

En équilibre, cependant, il est pratique de pouvoir inclure DDL dans une transaction multi-instruction.

Plus utile, la commande SQL Server DDL TRUNCATE - peut également être un élément d'une transaction multi-instruction . Vous pouvez tronquer une table cible (très rapide), la construire, puis vous engager si vous aimez le résultat. Si quelque chose ne va pas, vous retournez et voila!, C'est comme si vous n'aviez jamais dérangé la table. L'espace journal est également minimisé. Je profite de cela assez souvent.

10
KillerDBA

Dans SQL Server, nous pouvons annuler des déclarations DDL, il n'utilise pas Auto commit à la fin de la déclaration. Dans d'autres SGBD, je ne sais pas, mais je me souviens que dans Oracle, on ne peut pas faire de même. Je crois que c'est spécifique à chaque SGBD, pas sûr de ce que le SQL Standard le dire à ce sujet, mais je suis sûr qu'aucun producteur implémente 100% de la norme.

Il y a une question similaire sur SO: est-il possible d'exécuter plusieurs instructions DDL à l'intérieur d'une transaction (dans SQL Server)?

5
Marian

Oracle a partagé une analyse de requête partagée, donc un Select * de table_a faite par une session est (normalement) de la même manière que celle d'une autre session. Cela briserait si une session pensait qu'il y avait dix colonnes dans la table et une autre pensée qu'il y avait onze.

5
Gary