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;