提问人:niks 提问时间:5/10/2019 更新时间:5/10/2019 访问量:935
在Postgresql存储过程中使用准备好的语句或动态命令?
Use prepared statement or dynamic command in Postgresql stored procedure?
问:
我正在学习Postgreslq,我对这个代码示例有疑问:
CREATE OR REPLACE PROCEDURE CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT)
LANGUAGE plpgsql
AS $$
BEGIN
-- PREPARE addProject (VARCHAR(45),SMALLINT) AS
-- INSERT INTO projects (projectName, year) VALUES ($1, $2);
-- EXECUTE addProject(projectName, projectYear );
EXECUTE 'INSERT INTO projects (projectName, year) VALUES ($1, $2)'
USING projectName,projectYear;
END $$;
我正在尝试编写对SQL注入安全的存储过程。来自 Mysql,我知道我必须使用带有参数的预处理语句。在Postgresql中,它不允许(注释代码),另一方面,如果我使用动态命令,它可以工作。有人可以解释一下,为什么在这种情况下不能使用准备好的语句?
答:
2赞
Kaushik Nayak
5/10/2019
#1
执行计划是为 PL/PgSQL 准备和缓存的,它会自动发生。因此,为了优化,没有必要在PL / PGSQL中使用(正如你所看到的,你不能)。PREPARE
如果使用动态参数并使用串联来追加它们而不是参数化,则可以进行 SQL 注入。但是,由于您正在运行没有动态列/表的简单插入,因此不需要。EXECUTE
CREATE OR REPLACE procedure CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT )
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO projects (projectName, year) VALUES ($1, $2);
END $$;
评论