La razón por la que esto funciona en PostgreSQL es que los catálogos del sistema son tablas regulares. Por lo tanto, crear una nueva función, por ejemplo, solo requiere insertar una fila en la pg_proc
tabla, cambiar el valor predeterminado de una columna solo requiere realizar una actualización en alguna fila pg_attrdef
, y así sucesivamente. Dado que las tablas son transaccionales de todos modos, casi tendrás que salir de tu camino para que no funcione de esa manera. (Muchos detalles de implementación dolorosa se omiten aquí. ;-))
Supongo que, sin conocer el código fuente, otros motores de bases de datos usan algunas estructuras internas personalizadas para representar la información del catálogo del sistema. Por lo tanto, tendrían que hacer un esfuerzo adicional, probablemente un gran esfuerzo adicional, para que el DDL transaccional funcione, y aparentemente no es una prioridad para ellos.
La otra cara de esto es que esta es la razón por la cual las actualizaciones de versiones principales de PostgreSQL son tan dolorosas. Presumiblemente, otros productos pueden diseñar sus estructuras internas de metadatos con cambios y actualizaciones en mente, por lo que no hay problemas con la actualización a una nueva versión principal. En PostgreSQL, no hay forma de cambiar una tabla de catálogo del sistema para que parezca de repente una versión más nueva de una tabla de catálogo del sistema, al menos no mientras se mantiene el sistema en línea, ya que eso requeriría acceso a los catálogos del sistema. Urgh