在PostgreSQL中,CREATE FUNCTION
确实是一个“SQL语句”,但它只是一个
“wrapper”指定由某个东西执行的代码块
不同于SQL查询“引擎”。 Postgres(与其他DBMS不同)
支持可以执行代码块的多个“运行时引擎”
传递给“CREATE FUNCTION”语句 - 一个神器
那就是代码实际上是一个字符串所以只有CREATE FUNCTION
看到一个字符串,没有别的。
“代码实际上是一个字符串,因此CREATE FUNCTION只能看到一个字符串,没有别的”后果是什么?
这被视为动态SQL吗?与动态SQL相比,它是否会阻止或引入SQL注入风险?
与其他“代码不是字符串”的RDBMS(如果有的话)有何不同?
感谢。
答案 0 :(得分:1)
所有3GL +代码基本上都是一个字符串。 "参数"传递给CREATE FUNCTION
的是代码(将在核心SQL引擎上执行),这是一个字符串( SQL
其他RDMS仅支持SQL作为函数/过程体。
答案 1 :(得分:1)
PostgreSQL具有高度可扩展性,您可以定义自己的过程语言来编写函数。
PostgreSQL对该语言一无所知,只是它必须调用某个语言处理程序才能执行该函数。
选择实现此目的的方法是简化将代码作为字符串传递。
这只是一个实现细节,并不会使PostgreSQL函数比其他RDBMS更容易受到SQL注入攻击。
您需要在几个级别上保护自己免受注射:
函数参数:这里应尽可能选择非字符串数据类型。
函数中的SQL语句:这里应尽可能避免使用动态SQL,如果必须使用动态SQL,则应使用%L
format
模式插入变量功能
同样,如果将函数体指定为字符串,则这是相同的。