是否可以使用 ANALYZE 表指令创建过程?

问题描述 投票:0回答:1

我必须调用程序来按名称分析表。 例如:

call schema_name.analyze('table_name')
。 我已经创建了程序,但出现错误

错误:关系“x”不存在。

如何处理?

CREATE OR REPLACE PROCEDURE schema_name.analyze(IN x VARCHAR)
LANGUAGE plpgsql
AS $$
begin
    analyze x;
END;
$$;
sql postgresql
1个回答
1
投票

什么对我有用:

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$
© www.soinside.com 2019 - 2024. All rights reserved.