PostgreSQL 数据库 通过函数 批量创建模式、表、触发器等数据库对象

news/2024/7/9 22:54:36 标签: postgresql, 数据库, database
-- 创建或删除数据库对象
-- operate: create | drop
-- obj_type: schema | table | column | check_constraint | unique_constraint | foreign_constraint | exclude_constraint |
--           index | view | sequence | function | trigger | procedure | user | role
-- obj_num: 数量
CREATE OR REPLACE FUNCTION operate_database_object(operate varchar, obj_type varchar, obj_num integer)
	RETURNS void
	LANGUAGE 'plpgsql'
	COST 100
	VOLATILE
AS $BODY$
declare
	v_idx integer := 0;
	v_obj_name varchar := '';
	v_sql varchar := '';
	v_sql1 varchar := '';
	v_sql2 varchar := '';
begin
 
	v_obj_name = 'my_' || obj_type || '_';
 
	if operate = 'create' then
		v_sql1 = 'create ' || obj_type || ' ' || v_obj_name;
		if obj_type = 'schema' then
		else if obj_type = 'table' then
			v_sql2 = '(id int primary key, name varchar(100))';
		else if obj_type = 'column' then
			v_sql1 = 'alter table my_table_1 add id_';
			v_sql2 = 'int';
		else if obj_type = 'check_constraint' then
			v_sql1 = 'alter table my_table_1 add constraint ' || obj_type || '_';
			v_sql2 = 'check(id_1 > 0)';
		else if obj_type = 'unique_constraint' then
			v_sql1 = 'alter table my_table_1 add constraint ' || obj_type || '_';
			v_sql2 = 'unique(id_1)';
		else if obj_type = 'foreign_constraint' then
			v_sql1 = 'alter table my_table_1 add constraint ' || obj_type || '_';
			v_sql2 = 'foreign key (id) references my_table_2(id);';
		else if obj_type = 'exclude_constraint' then
			v_sql1 = 'alter table my_table_1 add constraint ' || obj_type || '_';
			v_sql2 = 'exclude using btree(id with =)';
		else if obj_type = 'index' then
			v_sql2 = 'on my_table_1(id)';
		else if obj_type = 'view' then
			v_sql2 = 'as select id, name from my_table_1';
		else if obj_type = 'sequence' then
			v_sql2 = 'cycle increment 1 start 1 minvalue 1 maxvalue 100 cache 10;';
		else if obj_type = 'function' then
			v_sql2 = '() returns trigger language plpgsql as $$ begin return new; end; $$;';
		else if obj_type = 'trigger' then
			v_sql2 = 'after delete ON my_table_1 execute function my_function_1();';
		else if obj_type = 'procedure' then
			v_sql2 = '() as $$ begin end; $$ language plpgsql;';
		else if obj_type = 'user' then
			v_sql2 = 'with password ''123456;''';
		else if obj_type = 'role' then
		end if; end if; end if; end if; end if; end if; end if; end if;
        end if; end if; end if; end if; end if; end if; end if;
 
	else if operate = 'drop' then
		v_sql1 = 'drop ' || obj_type || ' if exists ' || v_obj_name;
		if obj_type = 'trigger' then
			v_sql2 = 'on my_table_1';
		else if obj_type = 'column' then
			v_sql1 = 'alter table my_table_1 drop column if exists id_';
		else if position('constraint' in obj_type) > 0 then
			v_sql1 = 'alter table my_table_1 drop constraint if exists ' || obj_type || '_';
		end if; end if; end if;
	end if; end if;
 
  	while v_idx < obj_num loop
  		v_idx = v_idx + 1;
		v_sql = v_sql1 || v_idx || ' ' || v_sql2;
  		EXECUTE v_sql;
  	end loop;
end
$BODY$;

 
-- 调用
select operate_database_object('create', 'schema', 20);
select operate_database_object('drop', 'schema', 20);
select operate_database_object('create', 'table', 20);
select operate_database_object('drop', 'table', 20);
select operate_database_object('create', 'column', 20);
select operate_database_object('drop', 'column', 20);
-- 向表中批量插入数据
insert into my_table_1(id, name, id_20) select generate_series(1, 100), md5(random()::text), generate_series(1, 100);
delete from my_table_1;
select operate_database_object('create', 'check_constraint', 20);
select operate_database_object('drop', 'check_constraint', 20);
select operate_database_object('create', 'unique_constraint', 20);
select operate_database_object('drop', 'unique_constraint', 20);
select operate_database_object('create', 'foreign_constraint', 20);
select operate_database_object('drop', 'foreign_constraint', 20);
select operate_database_object('create', 'exclude_constraint', 20);
select operate_database_object('drop', 'exclude_constraint', 20);
select operate_database_object('create', 'index', 20);
select operate_database_object('drop', 'index', 20);
select operate_database_object('create', 'view', 20);
select operate_database_object('drop', 'view', 20);
select operate_database_object('create', 'sequence', 20);
select operate_database_object('drop', 'sequence', 20);
select operate_database_object('create', 'function', 20);
select operate_database_object('drop', 'function', 20);
select operate_database_object('create', 'trigger', 20);
select operate_database_object('drop', 'trigger', 20);
select operate_database_object('create', 'procedure', 20);
select operate_database_object('drop', 'procedure', 20);
select operate_database_object('create', 'user', 20);
select operate_database_object('drop', 'user', 20);
select operate_database_object('create', 'role', 20);
select operate_database_object('drop', 'role', 20);


http://www.niftyadmin.cn/n/1727439.html

相关文章

python普通类实现接口_Python 面向对象--继承,实现,依赖,关联,聚合,组合

一. 继承继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力.举例说明:classAnimal:print("吃是动物的本能")classCat(Animal):defcat_eat(self):print("猫儿优雅地吃东西")cCat()c.cat_eat()#以上代码执行结果:#吃是…

centos 卸载_Docker 安装、更新、卸载

​安装、更新、卸载Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用。Docker支持在主流的操作系统平台上使用&#xff0c;包括Ubuntu、Centos、Windows、MacOS系统等。Docker CE 分为…

vue el-table 表格宽度无法缩小自适应

当浏览器被拉升时&#xff0c;父子元素会同步拉升&#xff0c;但是当浏览器缩小时&#xff0c;父子元素无法同步缩小。 原因是element 内部的table宽度是根据父级元素来计算的。当父元素是 flex 布局时&#xff0c;嵌套的子元素会有一个是固定的宽度。当子元素的固定宽度大于 …

佳能c3320怎么设置接收方_新手学摄影全指南:认准4大品牌相机上手豁口,掌握9大参数设置...

如果你有过任何一次尝试学习一个工具或者一项技能的经历&#xff0c;相信在学习过程中你一定经历过从一头雾水到幡然领会的瞬间&#xff0c;找到某个技能的上手规律&#xff0c;撕开学习的口子之后&#xff0c;很多一开始觉得难以掌握的知识点&#xff0c;回过头来看却会发现它…

Linux 同步系统时间,并修改时区

1. 同步时间 sudo ntpdate ntp.api.bz 2. 选择时区 3. 替换时区文件 sudo mv /etc/localtime /etc/localtime.old sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Linux、Windows获取主板序列号和UUID

Linux&#xff1a; # 获取主板序列号 sudo dmidecode -s system-serial-number# 获取UUID sudo dmidecode -s system-uuid Windows&#xff1a; # 主板序列号 wmic baseboard get serialnumber# 获取UUID wmic csproduct list full | findstr UUID

git 怎么回退已经push的版本_git教程

前言&#xff1a;公司也开始用git版本控制了&#xff0c;总结汇总下常用命令&#xff5e;Git的思想和工作原理git是一个内容寻址文件系统&#xff0c;并在此之上提供了一个版本控制系统的用户界面。Git是一个分布式的版本控制系统Git和之前版本控制系统的区别Git 和其他版本控制…

vue el-table 滚动条样式设置(谷歌、火狐)

对于el-table滚动条的样式&#xff0c;webkit&#xff08;谷歌为代表&#xff09;和 moz&#xff08;火狐&#xff09;的设置是不同的&#xff0c;因此需要分别进行设置。 webkit&#xff08;谷歌&#xff09; // 滚动条大小设置 ::v-deep .el-table__body-wrapper::-webkit-…