рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛

рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдЦреБрд▓реЗрдкрди рдХреЗ рдХрд╛рд░рдг, рдирд┐: рд╢реБрд▓реНрдХ рдФрд░ рдмрдбрд╝реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдгред рдЕрдкрдирд╛рдИ рдЧрдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ (рд╡рд┐рдЪрд╛рд░) рдмрдирд╛рддреЗ рд╣реИрдВред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╕реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ, рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ, рд╣рдЯрд╛рдиреЗ рдФрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рдФрд░ рд╕реБрдВрджрд░ рджрд┐рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдердХ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛:

CREATE OR REPLACE FUNCTION pg_createview(table_ text, schema_ text) RETURNS integer AS $BODY$ DECLARE obj record; num integer; _schema alias for $2; _tablelike alias for $1; _table character varying; sql character varying; sqlclm1 character varying; sqlclm2 character varying; sqlclmkey character varying; _col text; exist_view character varying; BEGIN num:=0; FOR obj IN SELECT relname FROM pg_class c JOIN pg_namespace ns ON (c.relnamespace = ns.oid) WHERE relkind ='r' AND nspname = $2 AND relname LIKE $1 LOOP _table=obj.relname; --  --SELECT relname INTO exist_view FROM pg_class WHERE relname=_schema||'.v'||_table; SELECT relname INTO exist_view FROM pg_class c JOIN pg_namespace ns ON (c.relnamespace = ns.oid) WHERE nspname = _schema AND relname='v'||_table; IF exist_view IS NOT NULL THEN EXECUTE 'DROP VIEW '||_schema||'.v' || _table; END IF; --  EXECUTE 'CREATE OR REPLACE VIEW '||_schema||'.v' || _table || ' as select * from ' || $2 || '.' || _table; --   (,    .          ) sqlclmkey=''; --SELECT column_name into sqlclmkey FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_schema=_schema and table_name=_table and ordinal_position=1; SELECT pg_attribute.attname into sqlclmkey FROM pg_index, pg_class, pg_attribute WHERE pg_class.oid = (_schema||'.'||_table)::regclass AND indrelid = pg_class.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey) AND indisprimary; --    sqlclm1=''; sqlclm2=''; FOR _col IN execute 'select column_name from information_schema.columns where table_schema='||quote_literal(_schema)||' and table_name='||quote_literal(_table) Loop sqlclm1=sqlclm1||_col||','; sqlclm2=sqlclm2||'new.'||_col||','; end loop; sqlclm1=substring(sqlclm1 from 1 for (length(sqlclm1)-1) ); sqlclm2=substring(sqlclm2 from 1 for (length(sqlclm2)-1) ); sql='CREATE RULE "v'||_table||'_ins" AS ON INSERT TO "'||_schema||'"."v'||_table||'" DO INSTEAD ('; sql=sql||'INSERT INTO '||_schema||'.'||_table||'('||sqlclm1||') VALUES ('||sqlclm2||'););'; EXECUTE sql; --   update sqlclm1=''; sqlclm2=''; FOR _col IN execute 'select column_name from information_schema.columns where table_schema='||quote_literal(_schema)||' and table_name='||quote_literal(_table) Loop sqlclm1=sqlclm1||_col||'=new.'||_col||','; end loop; sqlclm1=substring(sqlclm1 from 1 for (length(sqlclm1)-1) ); sql='CREATE RULE "v'||_table||'_upd" AS ON UPDATE TO "'||_schema||'"."v'||_table||'" DO INSTEAD ('; sql=sql||' UPDATE '||_schema||'.'||_table||' SET '||sqlclm1||' WHERE '||sqlclmkey||'=old.'||sqlclmkey||';);'; EXECUTE sql; --   delete sql='CREATE RULE "v'||_table||'_del" AS ON DELETE TO "'||_schema||'"."v'||_table||'" DO INSTEAD ('; sql=sql||'DELETE FROM '||_schema||'.'||_table||' WHERE '||sqlclmkey||'=old.'||sqlclmkey||';);'; EXECUTE sql; num := num + 1; END LOOP; RETURN num; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION pg_createview(text, text) OWNER TO postgres; 


рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдореБрдЦ рдХреНрд╖реЗрддреНрд░ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ резред рдореБрдЦреНрдп рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓:
 select pg_createview( 'users', 'main'); 

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдореЗрдВ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ vusers рд╡реНрдпреВ рдорд┐рд▓рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ 2ред рдореБрдЦреНрдп рдпреЛрдЬрдирд╛ рдореЗрдВ "gz_" рдирд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓:
 select pg_createview( 'gz_%', 'main'); 

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдореЗрдВ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рдореИрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
1. рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕реНрд╡рд╛рдореА рдХреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд┐рдпреБрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП:

 CREATE OR REPLACE FUNCTION pg_owner(user_ text, table_ text, schema_ text) RETURNS integer AS $BODY$ DECLARE obj record; num integer; BEGIN num:=0; FOR obj IN SELECT relname FROM pg_class c JOIN pg_namespace ns ON (c.relnamespace = ns.oid) WHERE relkind in ('r','v') AND nspname = $3 AND relname LIKE $2 LOOP EXECUTE 'ALTER TABLE ' || $3 || '.' || obj.relname || ' OWNER TO ' || $1; num := num + 1; END LOOP; RETURN num; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION pg_owner(text, text, text) OWNER TO postgres; 


рдХреЙрд▓ рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ:
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ umain рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдпреЛрдЬрдирд╛ рдореЗрдВ "gz_" рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓:
 select pg_owner( 'umain', 'gz_%', 'main'); 

рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП
 select pg_owner( 'umain', 'vgz_%', 'main'); 

рдФрд░ рдЕрдЧрд░ рдирд╛рдореЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 select pg_owner( 'umain', '%gz_%', 'main'); 


2. рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдмрдбрд╝реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП: ( рдХрд╛рд░реНрдп рдХрд╛ рд╕реНрд░реЛрдд )
 CREATE OR REPLACE FUNCTION pg_grant(user_ text, action_ text, table_ text, schema_ text) RETURNS integer AS $BODY$ DECLARE obj record; num integer; BEGIN num:=0; FOR obj IN SELECT relname FROM pg_class c JOIN pg_namespace ns ON (c.relnamespace = ns.oid) WHERE relkind in ('r','v','S') AND nspname = $4 AND relname LIKE $3 LOOP EXECUTE 'GRANT ' || $2 || ' ON ' || $4 || '.' || obj.relname || ' TO ' || $1; num := num + 1; END LOOP; RETURN num; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION pg_grant(text, text, text, text) OWNER TO postgres; 


P | S рдлрд╝рдВрдХреНрд╢рди pg_createview рдХреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд┐рдирд╛ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ
- рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рддреЛ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдмрдирд╛рдПрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдПред

Source: https://habr.com/ru/post/In215373/


All Articles