2017-08-31 113 views
0

我们有一个程序,允许用户将未经修改的原始输入数据映射到标准化的最终表。无动态SQL的自定义SQL列公式

一般来说这是一个简单的一对一匹配,而不需要特殊的逻辑。

例如; raw_table.raw_col_1将映射到final_table.col_1,raw_table.raw_col_2将映射到final_table.col_2等

然而,一个客户希望有final_table.col_3能力如下映射:

case 
    when (raw_col_1 = 'S12' and raw_col_2 = 'D18') or raw_col_3 is not null then raw_col_3  
    else 'GF17' 
end 

其他类似的请求也在那里。

加载final_table时,我可以使用动态SQL轻松实现此目的。但是,这给我们开放SQL注入攻击。

有没有一种方法,我们可以允许这种类型的自定义字段映射的不诉诸动态SQL?

+0

变量加入,使像查询:'情况下(@var =真实raw_col_1 ...)...其他raw_col_3 end' –

+0

我认为简单的答案是:没有。它甚至不是恒定的(*其他类似的请求也存在。*)以满足用户驱动的可变性,它必须是动态的。 –

回答

1

你进入,允许开发工具的面积暴露在运行时向最终用户 - 在某些时候的配置变得足够复杂,它需要或模拟代码的能力。你有两个选择:

1)提供一个用户界面,可以考虑使用案例 - 例如简化查询生成器。并确保所有单个组件都得到验证或绑定。无论这是否可行,都将在复杂程度上结束,以及您希望将多少功夫放入此类用户界面。

2)提供管理级别的定制,允许客户提供更复杂的逻辑。由于这是一个Oracle数据库,因此您可以让它们将此作为可以返回该值的PL/SQL函数提供。

的第二选项既可以通过用户界面来完成,或通过后端装载机。但是,无论哪种情况,您都应确保管理员了解这是高度特权的功能,并审核进入的内容以及访问权限。

您也可以配置这种方式,使得软件包处于受限模式中的权限更多(并且使用定义者的权限调用),尽管最好的方式取决于您的数据库版本正在使用。 12c在这方面提供了更多的安全功能。