赞
踩
--drop view tab_info_v cascade;
CREATE or replace VIEW tab_info_v AS
WITH schemainfo AS (
SELECT pg_namespace.oid,
pg_namespace.nspname
FROM pg_namespace
), tbinfo AS (
SELECT pg_class.oid,
pg_class.relname,
(col_description(pg_class.oid, 0))::character varying AS comment,
pg_class.relkind,
pg_class.relnamespace
FROM pg_class
), colinfo AS (
SELECT pg_attribute.attrelid,
pg_attribute.attname,
pg_attribute.attnum,
(format_type(pg_attribute.atttypid, pg_attribute.atttypmod))::character varying AS typelen,
(col_description(pg_attribute.attrelid, (pg_attribute.attnum)::integer))::character varying AS comment,
CASE
when pg_attribute.attnotnull = 't' then 'NOT NULL' ELSE ''
end AS attnotnull
FROM pg_attribute
)
SELECT schemainfo.nspname AS schema,
tbinfo.relname AS table_name,
tbinfo.comment AS table_comment,
colinfo.attnum AS column_number,
colinfo.attname AS column_name,
CASE
WHEN ((colinfo.typelen)::text = 'bigint'::text) THEN 'INT8'::character varying
WHEN ((colinfo.typelen)::text = 'smallint'::text) THEN 'INT2'::character varying
WHEN ((colinfo.typelen)::text = 'integer'::text) THEN 'INT4'::character varying
WHEN ((colinfo.typelen)::text = 'text'::text) THEN 'TEXT'::character varying
WHEN ((colinfo.typelen)::text = 'oid'::text) THEN 'OID'::character varying
WHEN ("left"((colinfo.typelen)::text, 17) = 'character varying'::text) THEN (replace((colinfo.typelen)::text, 'character varying'::text, 'VARCHAR'::text))::character varying
WHEN ("left"((colinfo.typelen)::text, 9) = 'character'::text) THEN (replace((colinfo.typelen)::text, 'character'::text, 'CHAR'::text))::character varying
WHEN ((colinfo.typelen)::text = 'timestamp without time zone'::text) THEN 'TIMESTAMP'::character varying
WHEN ((colinfo.typelen)::text = 'timestamp(6) without time zone'::text) THEN 'TIMESTAMP'::character varying
WHEN ((colinfo.typelen)::text = 'numeric(38,10)'::text) THEN 'NUMERIC(38,10)'::character varying
ELSE colinfo.typelen
END AS column_type,
colinfo.attnotnull,
colinfo.comment AS column_comment
FROM tbinfo,
colinfo,
schemainfo
WHERE ((tbinfo.oid = colinfo.attrelid) AND (schemainfo.oid = tbinfo.relnamespace) AND (colinfo.attnum > 0) AND (tbinfo.relkind in ('r'::"char",'p'::"char")) AND (tbinfo.relname !~~ 'pg_%'::text) AND (tbinfo.relname !~~ 'sql_%'::text) AND (colinfo.attname !~~ '%.....pg.dropped%'::text))
ORDER BY schemainfo.nspname, tbinfo.relname, colinfo.attnum
;
grant select on tab_info_v to plan;
CREATE MATERIALIZED VIEW tab_info_mv AS
SELECT * FROM tab_info_v;
CREATE TABLE ddl_audit_log (
audit_log_id serial,
classid oid,
objid oid,
objsubid INT,
object_type TEXT,
SCHEMA_NAME TEXT,
object_name TEXT,
object_identity TEXT,
ddl_tag TEXT,
op_time TIMESTAMP,
ip_addr VARCHAR ( 50 ),
CONSTRAINT pk_ddl_audit_log_id PRIMARY KEY ( audit_log_id )
);
CREATE OR REPLACE FUNCTION event_trigger_drop_function ( )
RETURNS event_trigger
LANGUAGE plpgsql AS $$
DECLARE
obj record;
BEGIN
INSERT INTO ddl_audit_log ( classid, objid, objsubid, object_type, SCHEMA_NAME, object_name ,object_identity, ddl_tag, op_time, ip_addr )
SELECT
classid,
objid,
objsubid,
object_type,
SCHEMA_NAME,
object_name,
object_identity,
tg_tag,
now( ),
( SELECT client_addr FROM pg_stat_activity WHERE pid = pg_backend_pid ( ) ) AS ip_addr
FROM
pg_event_trigger_dropped_objects ( );
REFRESH MATERIALIZED VIEW 用户.tab_info_mv; -- 刷新物化视图
END;
$$;
create event trigger drop_table_event_trigger on sql_drop when tag in ('drop table')
execute procedure event_trigger_drop_function();
create or replace function event_trigger_ddl_commands_function()
returns event_trigger
language plpgsql
AS $$
declare
obj record;
begin
INSERT INTO ddl_audit_log ( classid, objid, objsubid, object_type, SCHEMA_NAME, object_name ,object_identity, ddl_tag, op_time, ip_addr )
select classid,objid,objsubid,object_type,schema_name,
'',object_identity,tg_tag,now()
,(select client_addr from pg_stat_activity where pid = pg_backend_pid()) as ip_addr
--,command_tag,in_extension
--,command
from pg_event_trigger_ddl_commands();
REFRESH MATERIALIZED VIEW 用户.tab_info_mv; -- 刷新物化视图
end;
$$;
--drop event trigger ddl_event_trigger;
create event trigger ddl_event_trigger on ddl_command_end
when tag in ('create table','create table as','alter table','comment')
execute procedure event_trigger_ddl_commands_function();
create event trigger ddl_start_event_trigger on ddl_command_start
when tag in ('alter table')
execute procedure event_trigger_ddl_commands_function();
grant insert,select on ddl_audit_log to 用户;
grant select,update on ddl_audit_log_audit_log_id_seq to 用户;
CREATE EXTENSION postgres_fdw;
grant usage on foreign data wrapper postgres_fdw to tzq;
select * from pg_foreign_data_wrapper;
--查询已安装的扩展
select * from pg_extension;
--所有版本的扩展
select * from pg_available_extensions where installed_version is not null;
create server fs_instruction_db_dev foreign data wrapper postgres_fdw
options(host '7.213.7.219',port '5432',dbname 'instruction_db_dev');
----查询外部服务器
--select * from pg_foreign_server;
----修改外部服务器
--ALTER SERVER fs_pg_cashplan_db_dev OPTIONS (host 'xxx', dbname 'xxx');
----删除外部服务器
--DROP SERVER IF EXISTS fs_pg_cashplan_db_dev;
----重命名外部服务器
--ALTER SERVER fs_pg_cashplan_db_dev RENAME TO fs_cashplan_db_dev;
--ALTER SERVER fs_pg_tmc_db_b1 RENAME TO fs_tmc_db_b1;
--ALTER SERVER fs_pg_tmc_db_uat RENAME TO fs_tmc_db_uat;
create user mapping for postgres server fs_tzq_db_dev
options(user 'tzq',password 'Tzq12345@');
----查询用户映射
--select * from pg_user_mappings order by srvname;
----为服务器 foo的用户映射bob更改口令:
--ALTER USER MAPPING FOR postgres SERVER fs_pg_cashplan_db_dev OPTIONS (SET password 'public');
----移除一个用于外部服务器的用户映射
--DROP USER MAPPING IF EXISTS FOR postgres SERVER fs_pg_cashplan_db_dev;
CREATE foreign TABLE public.ft_tab_info_mv_insdev (
schema varchar ,
t_comment varchar ,
table_name varchar ,
column_name varchar ,
type varchar ,
c_comment varchar
)
server fs_instruction_db_dev options (schema_name 'ins',table_name 'tab_info_mv');
--删除外部表
--drop foreign table ft_tab_info_t_plandev cascade;
--drop foreign table ft_tab_info_v_insdev cascade;
----7、查询外部表
select * from ft_tab_info_mv_insdev;
--查询所有外部表数据字典
select * from pg_foreign_table;
select (select c.relname from pg_class c where c.oid=f.ftrelid) as relname
,f.*
from pg_foreign_table f;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。