需要打印Postgresql数据库控制台



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) 的提升通知打印输入值

Craig Ringer回复了你,但我必须附上一份通知。

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

  • 只使用简单的SQL语句。只有在需要时才使用动态SQL
开始发出通知"…";INSERT INTO table_sp(pk_id、用户名、密码)值(pk,u,ps);结束;
  • 您使用了反模式-您的代码存在SQL注入漏洞。根据您使用的PostgreSQL版本,您可以使用更多模式来编写安全代码:
--非常旧(但安全,可读性更强)EXECUTE'INSERT INTO table_sp(pk_id,用户名,密码)VALUES('quote_literal;--little bit modern(8.4)-安全、可读且快速EXECUTE'INSERT INTO table_sp(pk_id,用户名,密码)VALUES($1,$2,$3)'使用pk、u、ps--或现代的(但是USING子句对于这个用例更好更快)EXECUTE格式('INSERT INTO table_sp(pk_id,用户名,密码)VALUES(%L,%L,%L)',pk,u,ps)

你更新后可以写代码:

--非常非常糟糕的代码!!!!!EXECUTE"some语句""||变量||""some other";

抱歉跑题了。

假设"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在内的大多数语言中不要使用关键字。

最新更新