Created
January 19, 2020 20:52
-
-
Save maykbrito/c7a16190b6b2447f72efd2240ad00bb0 to your computer and use it in GitHub Desktop.
Delete Cascade with Trigger and Procedures PostgreSQL.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE TABLE "users" ( | |
"id" SERIAL PRIMARY KEY, | |
"name" TEXT NOT NULL | |
); | |
CREATE TABLE "files" ( | |
"id" SERIAL PRIMARY KEY, | |
"name" text NOT NULL | |
); | |
CREATE TABLE "recipes" ( | |
"id" SERIAL PRIMARY KEY, | |
"user_id" INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, | |
"title" TEXT NOT NULL | |
); | |
-- PIVOT TABLE (Tabela Pivô usada para ligar duas tabelas) | |
CREATE TABLE "recipe_files" ( | |
"id" SERIAL PRIMARY KEY, | |
"recipe_id" integer REFERENCES recipes(id) | |
ON DELETE CASCADE, -- quando deletar receita, deletar essa entrada | |
"file_id" integer REFERENCES files(id) | |
); | |
-- Quero deletar os arquivos da receita que foi removida | |
-- Então vamos criar uma procedure para deletar o arquivo | |
CREATE OR REPLACE FUNCTION delete_files_when_recipe_files_row_was_deleted() | |
RETURNS TRIGGER AS $$ | |
BEGIN | |
-- executamos o comando de remoção | |
EXECUTE ('DELETE FROM files | |
WHERE id = $1') | |
USING OLD.file_id; -- OLD é a referencia da coluna de recipe_files que foi removido | |
RETURN NEW; -- Retornando a entrada de recipe_files | |
END; | |
$$ LANGUAGE plpgsql; | |
-- e vamos criar uma triiger que vai disparar a procedure de remoção, | |
-- depois que (AFTER) for deletada uma entrada em recipe_files | |
CREATE TRIGGER delete_recipe_files | |
AFTER DELETE ON recipe_files | |
FOR EACH ROW | |
EXECUTE PROCEDURE delete_files_when_recipe_files_row_was_deleted(); | |
-- cadastrar usuário | |
INSERT INTO users (name) VALUES ('mayk'); | |
-- cadastrar receitas do usuário acima | |
INSERT INTO recipes (user_id, title) VALUES (1, 'receita 01'); | |
INSERT INTO recipes (user_id, title) VALUES (1, 'receita 02'); | |
-- cadastrar arquivos | |
INSERT INTO files(name) VALUES ('imagem.jpg'); | |
INSERT INTO files(name) VALUES ('imagem2.jpg'); | |
INSERT INTO files(name) VALUES ('imagem3.jpg'); | |
-- cadastrar relacionamento com a tabela pivo | |
INSERT INTO recipe_files(recipe_id, file_id) VALUES(1, 1); | |
INSERT INTO recipe_files(recipe_id, file_id) VALUES(1, 2); | |
INSERT INTO recipe_files(recipe_id, file_id) VALUES(2, 3); | |
-- ao remover o usuário, todas suas receitas deverão ser deletadas, | |
-- assim como entradas na tabela pivot e, também, | |
-- os arquivos das receitas | |
DELETE FROM users WHERE id = 1; | |
-- apagar as tabelas pra recomeçar | |
DROP TABLE recipe_files; | |
DROP TABLE recipes; | |
DROP TABLE users; | |
DROP TABLE files; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment