在 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 (, );
-- EXECUTE addProject(projectName, projectYear );
EXECUTE 'INSERT INTO projects (projectName, year) VALUES (, )'
USING projectName,projectYear;
END $$;
我正在尝试编写可以安全防止 SQL 注入的存储过程。来自 Mysql,我知道我必须使用带参数的准备语句。在 Postgresql 中,它不允许(注释代码),另一方面,如果我使用动态命令,它就可以工作。有人可以解释一下,为什么在这种情况下不能使用准备好的语句?
已为 PL/PgSQL 准备并缓存执行计划,它会自动发生。因此,为了优化,没有必要在 PL/PGSQL 中使用 PREPARE
(如您所见,您不能)。
SQL 如果您使用动态参数并使用连接来附加它们而不是参数化,则注入是可能的。但是,由于您 运行 没有动态 columns/tables 的简单插入,因此不需要 EXECUTE
。
CREATE OR REPLACE procedure CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT )
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO projects (projectName, year) VALUES (, );
END $$;
我正在学习 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 (, );
-- EXECUTE addProject(projectName, projectYear );
EXECUTE 'INSERT INTO projects (projectName, year) VALUES (, )'
USING projectName,projectYear;
END $$;
我正在尝试编写可以安全防止 SQL 注入的存储过程。来自 Mysql,我知道我必须使用带参数的准备语句。在 Postgresql 中,它不允许(注释代码),另一方面,如果我使用动态命令,它就可以工作。有人可以解释一下,为什么在这种情况下不能使用准备好的语句?
已为 PL/PgSQL 准备并缓存执行计划,它会自动发生。因此,为了优化,没有必要在 PL/PGSQL 中使用 PREPARE
(如您所见,您不能)。
SQL 如果您使用动态参数并使用连接来附加它们而不是参数化,则注入是可能的。但是,由于您 运行 没有动态 columns/tables 的简单插入,因此不需要 EXECUTE
。
CREATE OR REPLACE procedure CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT )
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO projects (projectName, year) VALUES (, );
END $$;