需要打印Postgresql数据库控制台

时间:2013-07-17 07:02:34

标签: 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;

UserManualInputs:

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

我通过select new('2','admin','admin')提供了手动输入,我需要使用像(RAISE NOTICE 'PK is %','--'pk)

这样的加注通知在PostgreSQL控制台输入值中打印

2 个答案:

答案 0 :(得分:2)

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

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

  • 仅使用SQL语句。仅在需要时使用动态SQL!
BEGIN
  RAISE NOTICE '...';
  INSERT INTO table_sp(pk_id, username, password)
    VALUES(pk, u, ps);
END;
  • 你使用了反模式 - 你的代码是SQL注入漏洞。取决于您使用的PostgreSQL版本,您可以使用更多模式来编写安全代码:
  -- very old (but secure, and more readable)
  EXECUTE 'INSERT INTO table_sp (pk_id, username, password) VALUES ('
             quote_literal(pk) || ',' quote_literal(u) || ',' || quote_literal(ps) || ')';

  -- little bit modern (8.4) - secure, readable, and fast
  EXECUTE 'INSERT INTO table_sp (pk_id, username, password) VALUES($1,$2,$3)'
    USING pk, u, ps

  -- or modern (but USING clause is better and faster for this use case)
  EXECUTE format('INSERT INTO table_sp(pk_id, username, password) VALUES(%L,%L,%L)',
             pk, u, ps)

你新手可以编写代码:

-- very very very bad code!!!!!
EXECUTE 'some statement ''' || variable || ''' some other ';

抱歉为offtopic。

答案 1 :(得分: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系统日志文件中,因此您不应在生产应用程序中显示此类消息中的密码。

BTW,new是函数的一个非常糟糕的名称选择;我建议在大多数语言including SQL中使用的不是关键字。