1

Postgresql 数据库存储过程插入查询,我需要打印提升通知输入值

CREATE OR REPLACE FUNCTION new(pk character varying, u character varying,ps character varying)
      RETURNS SETOF record AS
    $BODY$
    BEGIN


    RAISE NOTICE 'PK is %','--'pk;
    RAISE NOTICE 'Username is %','--'u;
    RAISE NOTICE 'Password is %','--'ps;

    EXECUTE 'INSERT INTO table_sp("pk_id","username","password")VALUES ('''||pk||''' ,'''||u||''','''||ps||''')' ;


    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION new(character varying, character varying,character varying)
      OWNER TO postgres;

用户手册输入:

select new('2','admin','admin');

我提供了手动输入select new('2','admin','admin'),我需要使用引发通知在 PostgreSQL 控制台输入值中打印,例如(RAISE NOTICE 'PK is %','--'pk)

4

2 回答 2

2

克雷格·林格回复了你,但我必须附上通知。

在您的示例中使用动态 SQL(EXECUTE 语句)是非常错误的想法,并且实施也很糟糕。

  • 仅使用简单的 SQL 语句。仅在需要时使用动态 SQL!
开始
  发出通知'...';
  INSERT INTO table_sp(pk_id,用户名,密码)
    值(pk,u,ps);
结尾;
  • 您使用了反模式 - 您的代码存在 SQL 注入漏洞。取决于您使用的 PostgreSQL 版本,您可以使用更多模式来编写安全代码:
  -- 很旧(但安全,更易读)
  EXECUTE 'INSERT INTO table_sp(pk_id,用户名,密码)VALUES('
             报价文字(pk)|| ',' 引用文字(u) || ',' || 报价文字(ps)|| ')';

  -- 有点现代 (8.4) - 安全、易读、快速
  EXECUTE 'INSERT INTO table_sp(pk_id,用户名,密码)VALUES($1,$2,$3)'
    使用 pk、u、ps

  -- 或者现代(但是对于这个用例来说,USING 子句更好更快)
  EXECUTE format('INSERT INTO table_sp(pk_id, username, password) VALUES(%L,%L,%L)',
             PK,你,PS)

你更新可以写代码:

-- 非常非常非常糟糕的代码!!!!!!
EXECUTE '一些语句''' || 变量 || ''' 其他 ';

对不起题外话。

于 2013-07-17T07:41:01.133 回答
1

假设您所说的“PostgreSQL 控制台”是指psql,请确保您SET client_min_messages = 'notice'或更高。

不过,您的语法可能没有达到您的预期。演示使用DO而不是完整功能以保持简洁:

regress=> DO
$$
DECLARE
    pk integer := 4;
BEGIN
    RAISE NOTICE 'PK is %','--'pk;
END;
$$;
NOTICE:  PK is --
DO

也许你想要:

regress=> DO
$$
DECLARE
    pk integer := 4;
BEGIN
    RAISE NOTICE 'PK is --%',pk;
END;
$$;
NOTICE:  PK is --4
DO

?

请注意,此类消息也会记录到 PostgreSQL 系统日志文件中,因此您不应在生产应用程序中的此类消息中泄露密码。

顺便说一句,new对于函数来说,这是一个非常糟糕的名称选择;我建议在包括 SQL 在内的大多数语言中都不是关键字。

于 2013-07-17T07:25:43.650 回答