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?通知将是?