Sql 是否可以使用分析表指令创建过程?

Sql 是否可以使用分析表指令创建过程?,sql,postgresql,Sql,Postgresql,我必须调用过程来按名称分析表。 示例:调用schema\u name.analyze('table\u name')。 我已经创建了一个过程,但出现了一个错误 错误:关系“x”不存在 如何处理 CREATE OR REPLACE PROCEDURE schema_name.analyze(IN x VARCHAR) LANGUAGE plpgsql AS $$ begin analyze x; END; $$; 对我有用的是: CREATE OR REPLACE PROCEDURE p

我必须调用过程来按名称分析表。 示例:
调用schema\u name.analyze('table\u 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$
由于您正在进行动态命名,请使用
执行
。然后使用'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

要使用创建过程或函数的用户的权限运行该过程或函数,请使用
安全定义程序
。请参阅本页底部的部分:

安全地编写安全定义函数

为了该做的和不该做的

以下是带有
安全定义器的原始函数:

CREATE OR REPLACE PROCEDURE public.analyze_test(x character varying)
 LANGUAGE plpgsql SECURITY DEFINER
AS $procedure$
begin
    EXECUTE 'analyze ' || quote_ident(x);
END;
$procedure$

非常感谢。如果在没有quote_ident()的情况下对我有效,我将通过调用analyze_test('table_name')。我仍然建议使用
quote_ident()
。它将处理传入的具有混合大小写或空格的字符串,否则将折叠为小写或失败。有关更多信息,请参阅。请参阅UPDATE.Hmm,我发现在执行过程中会收到一个跳过“表”的通知——只有表或数据库所有者才能对其进行分析。我如何防止这种情况并为不同的用户运行analyze?通知将是?