为什么使用存储过程而不是直接查询到db?

时间:2012-03-01 09:38:58

标签: postgresql stored-procedures

我的公司正在制定新政策,因为我的公司会获得一些国际标准的认证。该策略是,DBA不允许直接查询数据库,如:

select * from some_table, update some_table, etc. 

我们必须使用存储过程来执行查询。

关于我在这里的最后一个问题:Postgres pl/pgsql ERROR: column "column_name" does not exist

我想知道,我们是否必须为每个表或每个条件创建一个存储过程? 有没有办法更有效地创建存储过程?

感谢你之前的回答..

抱歉我的英语不好..:D

1 个答案:

答案 0 :(得分:9)

使用存储过程的一些原因是:

  • 他们可能已接受过一些测试以确保他们这样做 不允许破坏业务规则,以及一些优化 表现。
  • 他们确保结果的一致性。每次被要求你 执行任务X,您运行与任务X关联的存储过程。 如果您编写查询,则每次都不能以相同的方式编写查询; 也许有一天,你会忘记一些愚蠢的东西,比如强迫文字 比较前的情况与错过的情况相同。
  • 他们开始写的时间比查询要长一些,但是 运行该存储过程比编写查询花费的时间更少 再次。运行足够多次,它变得更有效率 写了存储过程。
  • 他们减少或消除了解相关关系的需要 基础表格。
  • 您可以授予执行存储过程的权限(使用 security definer),但拒绝对基础表的权限。
  • 可以提供程序员(如果您将DBA和程序员分开) API,这就是他们需要知道的全部内容。只要你坚持下去 更改数据库时,您可以进行必要的更改 在不破坏软件的情况下实现基础关系;确实, 你甚至不需要知道他们用你的API做了什么。

您可能最终会为每个查询创建一个存储过程,否则您将执行该操作。

与仅编写查询相比,我不确定为什么您认为这样效率低,或者特别耗时。如果您所做的只是将查询放在存储过程中,那么额外的工作应该是最小的。

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,函数可以更加动态(虽然这会增加执行函数的人需要知道函数如何工作的程度,所以我尽量避免它。)

如果“效率较低”来自函数中包含的其他逻辑,则仅使用查询的比较是不公平的,因为该函数正在执行其他工作。

相关问题