2016-06-17 8 views
0

postgresql에서 지정된 제한 시간 내에 쿼리 작업을 수행해야한다는 요구 사항이 있습니다. 해당 제한 시간 내에 쿼리가 수행되지 않으면 우리는 예외/동작을 잡아야하며이 쿼리 작업이 수행되는 것을 차단하는 다른 모든 작업을 중단하고 업그레이드 작업을 수행해야합니다.함수 내에서 "statement_timeout"작업을 어떻게 만들 수 있습니까?

다음
CREATE OR REPLACE FUNCTION execute_upgrade_statement(upgrade_stat text) RETURNS int as $$ 
BEGIN 
EXECUTE upgrade_stat; 
return 1; 
END; 
$$ 
LANGUAGE plpgsql; 


CREATE OR REPLACE FUNCTION upgrade_function(upgrade_statement text,upgrading_table text) RETURNS void as $$ 
DECLARE 
    pid INTEGER; 
    return_value INTEGER; 
    pid_values INTEGER[]; 
BEGIN 
SET statement_timeout TO 6000; 
LOOP 
BEGIN 
select execute_upgrade_statement(upgrade_statement) into return_value; 
if return_value = 1 THEN 
raise notice 'Upgrade query performed'; 
return; 
else 
continue; 
end if; 
END; 
END LOOP; 
exception when query_canceled then 
select into pid_values array_agg(p1.pid) from pg_locks p1 LEFT JOIN pg_stat_activity psa on p1.pid=psa.pid where p1.relation=(select relid from pg_stat_all_tables where relname=upgrading_table) and p1.pid <> pg_backend_pid(); 
FOREACH pid IN ARRAY pid_values 
LOOP 
raise notice 'pid value : %',pid; 
perform pg_terminate_backend(pid); 
END LOOP; 
END; 
$$ 
LANGUAGE plpgsql; 


begin; 
select upgrade_function('statement','table_name'); 
commit; 

statement_timeout이 기능은 서버 측에서 호출 될 때 실행하기 아니라,이 클라이언트 측에서 호출 될 때 실행지고 :로 생성 등이 프로토 타입를 들어 다음과 같습니다. 서버 측 호출에서 statement_timeout 작업을 수행하는 다른 방법이 있습니까? 또는 지정된 제한 시간 내에 업그레이드 작업을 수행하는 다른 방법이 있습니까?

답변

0

실제로 서버 기능 내에서 statement_timeout을 효과적으로 변경할 수 없으므로 외부 쿼리를 보내기 전에 클라이언트 측에서 수행해야합니다.

DBA.SE에 비슷한 질문을 참조하십시오 : 다시 2007 날짜 Why “SET LOCAL statement_timeout” does not work as expected with PostgreSQL functions?

또는 포스트 그레스에서이 스레드 메일 링리스트를하지만, 부정적인 대답은 여전히 ​​현재 버전 적용

statement_timeout doesnt work within plpgsql by design?

0

실제로 서버 기능 내에서 statement_timeout을 효과적으로 변경할 수 없으므로 최상위 수준 쿼리를 보내기 전에 클라이언트 쪽에서 수행해야합니다.

DBA.SE에 비슷한 질문을 참조하십시오 : 다시 2007 날짜 Why “SET LOCAL statement_timeout” does not work as expected with PostgreSQL functions?

또는 포스트 그레스에서이 스레드 메일 링리스트를하지만, 부정적인 대답은 여전히 ​​현재 버전 적용

statement_timeout doesnt work within plpgsql by design?