我的公司正在制定新政策,因为我的公司会获得一些国际标准的认证。该策略是,DBA不允许直接查询数据库,如:
select * from some_table, update some_table, etc.
我们必须使用存储过程来执行查询。
关于我在这里的最后一个问题:Postgres pl/pgsql ERROR: column "column_name" does not exist
我想知道,我们是否必须为每个表或每个条件创建一个存储过程? 有没有办法更有效地创建存储过程?
感谢你之前的回答..
抱歉我的英语不好..:D
答案 0 :(得分:9)
使用存储过程的一些原因是:
security definer
),但拒绝对基础表的权限。您可能最终会为每个查询创建一个存储过程,否则您将执行该操作。
与仅编写查询相比,我不确定为什么您认为这样效率低,或者特别耗时。如果您所做的只是将查询放在存储过程中,那么额外的工作应该是最小的。
CREATE OR REPLACE FUNCTION aSchema.aProcedure (
IN var1 text,
IN var2 text,
OUT col1 text,
OUT col2 text
)
RETURNS setof record
LANGUAGE plpgsql
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
SET search_path = aSchema, pg_temp
AS $body$
BEGIN
RETURN QUERY /*the query you would have written anyway*/;
END;
$body$;
GRANT EXECUTE ON FUNCTION aSchema.aProcedure(text, text) TO public;
正如您在上一个问题中所使用的那样,通过将列/表作为参数传递并使用EXECUTE,函数可以更加动态(虽然这会增加执行函数的人需要知道函数如何工作的程度,所以我尽量避免它。)
如果“效率较低”来自函数中包含的其他逻辑,则仅使用查询的比较是不公平的,因为该函数正在执行其他工作。