Víctor, parte de este gran staff, nos hizo el favor de crear este escrito porque domina muy bien el tema.
Cuando crea estructuras de base de datos complejas que involucran muchas tablas con key restricciones, vistas, activadores, funciones, etc. implícitamente crea una red de dependencias entre los objetos. Por ejemplo, una mesa con un extranjero key la restricción depende de la tabla a la que hace referencia.
Para garantizar la integridad de toda la estructura de la base de datos, PostgreSQL se asegura de que no pueda descartar objetos de los que todavía dependen otros objetos. Por ejemplo, intentar eliminar la tabla de productos que consideramos en la Sección 5.4.5, con la tabla de pedidos dependiendo de ella, daría como resultado un mensaje de error como este:
DROP TABLE products; ERROR: cannot drop table products because other objects depend on it DETAIL: constraint orders_product_no_fkey on table orders depends on table products HINT: Use DROP ... CASCADE to drop the dependent objects too.
El mensaje de error contiene una sugerencia útil: si no desea molestarse en eliminar todos los objetos dependientes individualmente, puede ejecutar:
DROP TABLE products CASCADE;
y todos los objetos dependientes se eliminarán, al igual que cualquier objeto que dependa de ellos, recursivamente. En este caso, no elimina la tabla de pedidos, solo elimina el extranjero key restricción. Se detiene allí porque nada depende del extranjero. key restricción. (Si quieres comprobar qué DROP ... CASCADE
lo hare, corre DROP
sin CASCADE
y lee el DETAIL
producción.)
Casi todos DROP
comandos en el soporte de PostgreSQL especificando CASCADE
. Por supuesto, la naturaleza de las posibles dependencias varía según el tipo de objeto. También puedes escribir RESTRICT
en lugar de CASCADE
para obtener el comportamiento predeterminado, que es evitar que se suelten objetos de los que dependan otros objetos.
Nota
De acuerdo con el estándar SQL, especificar ya sea
RESTRICT
oCASCADE
se requiere en unDROP
mando. En realidad, ningún sistema de base de datos impone esa regla, pero si el comportamiento predeterminado esRESTRICT
oCASCADE
varía a través de los sistemas.
si un DROP
el comando enumera múltiples objetos, CASCADE
solo se requiere cuando hay dependencias fuera del grupo especificado. Por ejemplo, al decir DROP TABLE tab1, tab2
la existencia de un extranjero key referenciando tab1
desde tab2
no significaría eso CASCADE
se necesita para tener éxito.
Para las funciones definidas por el usuario, PostgreSQL rastrea las dependencias asociadas con las propiedades visibles externamente de una función, como sus argumentos y tipos de resultados, pero no dependencias que solo podrían conocerse examinando el cuerpo de la función. Como ejemplo, considere esta situación:
CREATETYPE rainbow ASENUM('red','orange','yellow','green','blue','purple');CREATETABLE my_colors (color rainbow, note text);CREATEFUNCTION get_color_note (rainbow)RETURNStextAS'SELECT note FROM my_colors WHERE color = $1'LANGUAGESQL;
(Ver Sección 37.5 para obtener una explicación de las funciones del lenguaje SQL). PostgreSQL será consciente de que el get_color_note
función depende de la rainbow
tipo: descartar el tipo obligaría a descartar la función, porque su tipo de argumento ya no estaría definido. Pero PostgreSQL no considerará get_color_note
depender de la my_colors
tabla, por lo que no eliminará la función si se descarta la tabla. Si bien hay desventajas en este enfoque, también hay beneficios. La función sigue siendo válida en cierto sentido si falta la tabla, aunque ejecutarla provocaría un error; crear una nueva tabla con el mismo nombre permitiría que la función volviera a funcionar.
Anterior | Arriba | Próximo |
5.13. Otros objetos de base de datos | Casa | Capítulo 6. Manipulación de datos |