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

Dia*_*nto 5 postgresql stored-procedures

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

select * from some_table, update some_table, etc. 
Run Code Online (Sandbox Code Playgroud)

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

关于我在这里的最后一个问题:Postgres pl/pgsql错误:列"column_name"不存在

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

谢谢你的回答..

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

Mat*_*att 9

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

  • 他们可能已经进行了一些测试,以确保他们不会破坏业务规则,以及对性能进行一些优化.
  • 它们确保结果的一致性.每次要求您执行任务X时,都会运行与任务X关联的存储过程.如果您编写查询,则每次都不能以相同的方式编写查询; 也许有一天,你会忘记一些愚蠢的事情,比如在比较之前强迫文本进入同一个案例并且错过了一些东西.
  • 它们开始花费的时间比查询要长一些,但运行该存储过程所花费的时间比再次编写查询所花费的时间更少.运行足够多次,编写存储过程变得更有效率.
  • 它们减少或消除了了解基础表关系的需要.
  • 您可以授予执行存储过程(with security definer)的权限,但拒绝对基础表的权限.
  • 程序员(如果您将DBA和程序员分开)可以提供API,这就是他们需要知道的全部内容.只要您在更改数据库时维护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;
Run Code Online (Sandbox Code Playgroud)

正如您在上一个问题中所使用的那样,通过将列/表作为参数传递并使用EXECUTE,函数可以更加动态(虽然这会增加执行函数的人需要知道函数如何工作的程度,所以我尽量避免它).

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