이름으로 테이블을 분석하려면 프로 시저를 호출해야합니다. 예 : call schema_name.analyze('table_name')
. 절차를 만들었지 만 오류가 발생했습니다.
오류 : 관계 "x"가 존재하지 않습니다.
어떻게 처리할까요?
CREATE OR REPLACE PROCEDURE schema_name.analyze(IN x VARCHAR)
LANGUAGE plpgsql
AS $$
begin
analyze x;
END;
$$;
나를 위해 일한 것 :
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$
동적 이름 지정을 사용하고 있기 때문에 EXECUTE
. 그런 다음`quote_ident ()는 전달 된 이름을 올바르게 인용합니다.
최신 정보
quote_ident()
중요한 이유의 예 :
create table "MixedCase" (id int);
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || x;
END;
$procedure$
call analyze_test('MixedCase');
ERROR: relation "mixedcase" does not exist
CONTEXT: SQL statement "analyze MixedCase"
PL/pgSQL function analyze_test(character varying) line 3 at EXECUTE
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$
call analyze_test('MixedCase');
CALL
업데이트 2
프로 시저 또는 함수를 생성 한 사용자의 권한으로 실행하려면을 사용하십시오 SECURITY DEFINER
. 이 페이지 하단의 섹션을 참조하십시오.
https://www.postgresql.org/docs/current/sql-createfunction.html
SECURITY DEFINER 함수를 안전하게 작성
해야 할 것과하지 말아야 할 것.
다음은 원래 기능입니다 SECURITY DEFINER
.
CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
LANGUAGE plpgsql SECURITY DEFINER
AS $procedure$
begin
EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다