Greenplum은 DB로서의 역활 뿐만 아니라 유용한 확장 패키지들이 있습니다.
이중 pl/python으로 함수를 만들면, In-DB 분석을 할 수 있을 뿐만 아니라 DB 안에서 다양한 유틸리티를 수행할 수 있습니다.
다만, pl/python으로 사용하는 경우, OS 커멘드까지 수행할 수 있어서, 슈퍼유저의 권한이 필요로 합니다.
슈퍼유저 권한 없이 일반 유저가 pl/python 을 생성/수정할 수 있도록 설정하는 방법은 아래와 같습니다.
1. 일반 유저가 pl/python 수행시 발생하는 에러
[gpadmin@r8g6single mngdb]$ psql -U udbaTiming is on.psql (9.4.26)Type "help" for help.gpkrtpch=> CREATE FUNCTION pymax (a integer, b integer)RETURNS integerAS $$if a > b:return areturn b$$ LANGUAGE plpythonu;ERROR: permission denied for language plpythonuTime: 0.492 msgpkrtpch=>
2. pl/python 권한 주기 위한 내용 요약
1) Greenplum에서는 plpythonu를 생성하면, lanpltrusted 필드가 false로 기본 셋팅 됩니다.
이를 일반 유저가 사용할 수 있도록 true로 설정하면, 모든 유저가 일반 프로시저를 생성하는 것과 같이 pl/python을 사용할 수 있습니다.
2) 해당 시스템 카탈로그를 업데이트하려면, 마스터 인스턴스 뿐만 아니라 모든 인스턴스에서 true로 업데이트가 필요합니다.
gpadmin=# create language plpythonu;CREATE LANGUAGETime: 125.521 msgpadmin=# select * from pg_language;lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl-----------+----------+---------+--------------+------------ ---+-----------+-------------- +-------- internal | 10 | f | f | 0 | 0 | 2246 |c | 10 | f | f | 0 | 0 | 2247 |sql | 10 | f | t | 0 | 0 | 2248 |plpgsql | 10 | t | t | 12332 | 12333 | 12334 |plpythonu | 10 | t | f =>t 변경필요 | 26231 | 26232 | 26233 |gpadmin=#
2. pl/python 권한 주기
1) 사전 현재 환경 확인 (콘솔/gpadmin 계정)
$ psql -c "select * from pg_language;"
lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl-----------+----------+---------+--------------+------------ ---+-----------+-------------- +-------- internal | 10 | f | f | 0 | 0 | 2246 |c | 10 | f | f | 0 | 0 | 2247 |sql | 10 | f | t | 0 | 0 | 2248 |plpgsql | 10 | t | t | 12332 | 12333 | 12334 |plpythonu | 10 | t | f | 26231 | 26232 | 26233 |
2) pl/python 권한
- 첨부 파일은 https://github.com/gpdbkr/ gpkrutil/blob/main/mngdb/ trusting_plpython.sh 에도 올려 놓았습니다.
- trusting_plpython.sh 내용 : 모든 세그먼트에 plpythonu의 lanpltrusted 필드를 false에서 true로 업데이트
$ su - gpadmin
$ export PGDATABASE=databasename ## 현재 사용하는 databasename
$ sh trusting_plpython.sh
$ cat trusting_plpython.sh ## 소스#!/bin/bash### This script for GPDB 6.x### Get segments host and portsql_segments="select hostname || ' ' || port from gp_segment_configuration where preferred_role = 'p';"### Loop over segmentspsql -Atc "${sql_segments}" | while read host port;doecho "PROCESSING ${host}, ${port}";PGOPTIONS="-c gp_session_role=utility" psql -a -h ${host} -p ${port} <<EOFset allow_system_table_mods=on;update pg_language set lanpltrusted = true where lanname = 'plpythonu';EOFdone$
3) pl/python 업데이트 확인
$ psql -c "select * from pg_language;"
lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl-----------+----------+---------+--------------+------------ ---+-----------+-------------- +-------- internal | 10 | f | f | 0 | 0 | 2246 |c | 10 | f | f | 0 | 0 | 2247 |sql | 10 | f | t | 0 | 0 | 2248 |plpgsql | 10 | t | t | 12332 | 12333 | 12334 |plpythonu | 10 | t | t | 26231 | 26232 | 26233 |
3. 일반 유저로 pl/python 함수 생성
1) 일반 유저로 DB 접속
$ psql -U 일반유저
[gpadmin@r8g6single mngdb]$ psql -U udbaTiming is on.psql (9.4.26)Type "help" for help.
gpkrtpch=> CREATE FUNCTION pymax (a integer, b integer)RETURNS integerAS $$if a > b:return areturn b$$ LANGUAGE plpythonu;CREATE FUNCTIONTime: 53.240 msgpkrtpch=> gpkrtpch=> select pymax(1, 2);pymax
-------
2
(1 row)
Time: 11.096 ms
gpkrtpch=>
댓글 없음:
댓글 쓰기