-- -- Nome Artefato/Programa..: exclusao.sql -- Instituicao.............: -- Autor(es)...............: O Peregrino (emersonhermann at gmail.com) -- Data Inicio ............: 29/06/2010 -- Data Atual..............: 29/06/2010 -- Versao..................: 0.01 -- Linguagem...............: PL/pgSQL -- Compilador/Interpretador: PostgreSql -- Sistemas Operacionais...: Linux/Windows -- SGBD....................: PostgreSql 8.x -- Kernel..................: Nao informado! -- Finalidade..............: Efetuar exclusao segura de um registro -- OBS1....................: Efetuar exclusao segura de um registro DROP FUNCTION IF EXISTS public.exclusao(INTEGER); CREATE OR REPLACE FUNCTION public.exclusao(INTEGER) RETURNS BOOLEAN AS $$ BEGIN DELETE FROM tabela WHERE campo_chave=$1; IF FOUND THEN RAISE NOTICE 'O registro % foi excluido.',$1; RETURN TRUE; END IF; RAISE NOTICE 'O registro % não foi encontrado.',$1; RETURN FALSE; END; $$ LANGUAGE 'plpgsql' RETURNS NULL ON NULL INPUT ; --polimorfismo DROP FUNCTION IF EXISTS public.exclusao(esquema_tabelax VARCHAR(255), campox VARCHAR(255), idx INTEGER); CREATE OR REPLACE FUNCTION public.exclusao(esquema_tabelax VARCHAR(255), campox VARCHAR(255), idx INTEGER) RETURNS BOOLEAN AS $$ DECLARE ds_comando TEXT; deletado BIGINT; BEGIN IF (esquema_tabelax IS NULL) THEN RAISE EXCEPTION 'ESQUEMA TABELA COM VALOR NULO!'; -- caso o parametro venha nulo END IF; IF (campox IS NULL) THEN RAISE EXCEPTION 'CAMPO COM VALOR NULO!'; -- caso o parametro venha nulo END IF; IF (idx IS NULL) THEN RAISE EXCEPTION 'ID COM VALOR NULO!'; -- caso o parametro venha nulo END IF; ds_comando := 'DELETE FROM ' || esquema_tabelax || ' WHERE ' || campox || '=' || idx; EXECUTE ds_comando; GET DIAGNOSTICS deletado = ROW_COUNT; IF deletado > 0 THEN RAISE NOTICE '%', ds_comando; RAISE NOTICE 'Total de registro(s) deletado(s): %',deletado; RETURN TRUE; END IF; RAISE NOTICE '%', ds_comando; RAISE NOTICE 'Total de registro(s) deletado(s): %',deletado; RAISE NOTICE 'O registro % não foi encontrado. NADA FOI DELETADO!!.',idx; RETURN FALSE; END; $$ LANGUAGE 'plpgsql' RETURNS NULL ON NULL INPUT ; DROP TABLE IF EXISTS "E PRA SER DELETADO"; CREATE TABLE "E PRA SER DELETADO" ( ID INTEGER ); INSERT INTO "E PRA SER DELETADO" (id) VALUES (6); INSERT INTO "E PRA SER DELETADO" (id) VALUES (6); INSERT INTO "E PRA SER DELETADO" (id) VALUES (6); SELECT * FROM "E PRA SER DELETADO"; DROP TABLE IF EXISTS apague_me; CREATE TABLE apague_me ( ID INTEGER ); INSERT INTO apague_me (id) VALUES (1); INSERT INTO apague_me (id) VALUES (2); INSERT INTO apague_me (id) VALUES (3); INSERT INTO apague_me (id) VALUES (4); INSERT INTO apague_me (id) VALUES (5); INSERT INTO apague_me (id) VALUES (6); INSERT INTO apague_me (id) VALUES (6); INSERT INTO apague_me (id) VALUES (6); INSERT INTO apague_me (id) VALUES (7); --DELETE FROM public.apague_me WHERE id = 6; SELECT * FROM apague_me; --testes --deletar pelos parametros SELECT EXCLUSAO('public.apague_me','ID',6); --ok --delete pelos parametros com null SELECT EXCLUSAO('public.apague_me','ID',NULL); --ok SELECT EXCLUSAO('public.apague_me',NULL,NULL); --ok SELECT EXCLUSAO(NULL,NULL,NULL); --ok --tabela ou campos inexistentes SELECT EXCLUSAO('public.apague_me','idx',6); --ok SELECT EXCLUSAO('public.apague_mex','id',6); --ok --com transacao BEGIN; SELECT EXCLUSAO('public.apague_me','id',6); --ok --ROLLBACK; --COMMIT; --sem parametros SELECT EXCLUSAO('public.apague_me','ID'); --ok --sql injection SELECT EXCLUSAO('drop database banco;','ID',6); --ok --case sensitve SELECT EXCLUSAO('"E PRA SER DELETADO"','ID',6); --ok SELECT EXCLUSAO('public."E PRA SER DELETADO"','ID',6); --ok
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
quinta-feira, 16 de setembro de 2010
Efetuando exclusão segura de registro de uma tabela com store function
Efetuando exclusão segura de registro de uma tabela com store function
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário