pgsql 批量创建字段和触发器

pgsql 批量创建字段和触发器

-- FUNCTION: public.fn_add_trigger()

-- DROP FUNCTION public.fn_add_trigger();

CREATE OR REPLACE FUNCTION public.fn_add_trigger(
	)
    RETURNS character varying
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    
AS $BODY$
DECLARE
r record;
col integer;
tig integer;
BEGIN

FOR r IN SELECT tablename FROM pg_tables WHERE SCHEMANAME = 'public'
LOOP
    SELECT COUNT(*) INTO col FROM information_schema.columns WHERE table_name = ''|| r.tablename ||'' AND column_name = 'create_at';
	IF col = 0 THEN 
		RAISE NOTICE '创建字段create_at %', col;
		EXECUTE 'ALTER TABLE '|| r.tablename ||' ADD create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP';
		EXECUTE 'COMMENT ON COLUMN public.'|| r.tablename ||'.create_at IS ''创建时间''';
    END IF;
	
	SELECT COUNT(*) INTO col FROM information_schema.columns WHERE table_name = ''|| r.tablename ||'' AND column_name = 'update_at';
	IF col = 0 THEN 
		RAISE NOTICE '创建字段update_at %', col;
		EXECUTE 'ALTER TABLE '|| r.tablename ||' ADD update_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP';
		EXECUTE 'COMMENT ON COLUMN public.'|| r.tablename ||'.update_at IS ''更新时间''';
		
		RAISE NOTICE '创建触发器';
		EXECUTE 'CREATE TRIGGER '|| r.tablename ||'_update_timestamp BEFORE UPDATE ON public.'|| r.tablename ||' FOR EACH ROW EXECUTE PROCEDURE public.update_timestamp()';
	ELSE
	    SELECT COUNT(*) INTO tig FROM pg_trigger WHERE tgname=''|| r.tablename ||'_update_timestamp';
		IF tig = 0 THEN
			RAISE NOTICE '创建触发器';
			EXECUTE 'CREATE TRIGGER '|| r.tablename ||'_update_timestamp BEFORE UPDATE ON public.'|| r.tablename ||' FOR EACH ROW EXECUTE PROCEDURE public.update_timestamp()';
    	END IF;
	END IF;
	RAISE NOTICE 'tables_name %', r.tablename; 
END LOOP;

RETURN 'SUCCESS';

END;
$BODY$;

ALTER FUNCTION public.fn_add_trigger()
    OWNER TO postgres;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程漫步者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值