如何在一个数据库命中中将多个插入或更新推送到一起 - 对于多数据库(SQL Server、Oracle、MySQL 和 PostgreSQL)应用程序
Posted
技术标签:
【中文标题】如何在一个数据库命中中将多个插入或更新推送到一起 - 对于多数据库(SQL Server、Oracle、MySQL 和 PostgreSQL)应用程序【英文标题】:How to push multiple inserts or updates together in one single db hit - for a multi DB (SQL Server, Oracle, MySQL and PostgreSQL) App 【发布时间】:2013-02-09 19:06:13 【问题描述】:我正在尝试为我们的项目开发一个数据层库,它支持多个数据库(SQL Server、Oracle、MySQL 和 PostgreSQL,位于这点)。数据库服务器通常会托管在公共云中。数据访问(选择、插入、更新、删除)是从 Windows 窗体客户端和 Web 服务器执行的。 winforms 客户端迫使我以这样一种方式设计东西,即进行最少的数据库往返。
我遇到的问题是“如何在一个数据库命中同时推送多个插入或更新”。
我已经对此进行了大量的谷歌搜索和研究,并且知道参数化插入/更新是记住 SQL 注入攻击的方法。但它不适合我,因为我不想多次往返数据库。
BulkCopy 是特定于 SQL Server 的,主要用于插入。
存储过程/XML - 我有不同的数据库,这使得为每个数据库维护存储过程变得困难和困难。而且表的数量也不是静态的,可能随时引入新表或更改现有表,因为应用程序本质上是动态的。
对我来说最好的选择(此时)是连接 sql 字符串(当然使用 StringBuilder)并一次性触发查询。我查看了 owasp-esapi-dotnet 库 (http://code.google.com/p/owasp-esapi-dotnet/) 但没有实现 sql 编码(以防止 sql 注入)。此外,该项目现在看起来已经死了(最后一次提交是在 2010 年 12 月)。
是否有任何开源实现可以为多个数据库(至少 SQL Server、Oracle、mysql 和 PostgreSQL)处理 SQL 注入?
有没有其他方法可以实现这个目标(在单个数据库往返中进行多次插入/更新)?
我在 .NET 4 上使用 C#。
编辑:我们正试图将其作为一种产品推出,客户将有机会挑选/选择他/她想要的任何数据库供应商。
【问题讨论】:
@a_horse_with_no_name:抱歉,忘了说我使用的是 C#.NET。 看起来您已经检查并放弃了该问题的常见解决方案(即应用程序服务器、存储过程或将自己限制为一个数据库供应商)。我认为你必须决定在应用程序端推出你自己的解决方案来解释 SQL 注入本身是否比使用存储过程维护代码复杂得多或少。依稀记得SqlClient的CommandText中有多个语句有问题,但是太长记不住了。 @BaconBits:我们正试图将其作为一种产品推出,客户将有机会挑选/选择他想要的任何数据库供应商。 您可以通过将所有记录操作上移到数据库上的服务来做到这一点。构建一个文件并加载它,例如大多数 DBMS 都有一个版本。不过,您需要在任何批量更新/插入时回答的大问题是和解。 我明白这一点。我的观点是,您已经放弃了我所知道的常见解决方案。因此,无论您做什么,都必须编写自己的代码。是更容易编码和维护在客户端处理但更容易受到注入的东西,还是在更难编码和维护的服务器上编码和维护存储过程? 【参考方案1】:如果这是我的问题,我会在 sql server 上设置链接服务器。然后我会编写存储过程,从您的应用程序中接受必要的参数并对其进行处理。
【讨论】:
我看不到链接服务器如何帮助“在单个查询中推送多个更新”。尤其是 Oracle 或 Postgres @a_horse_with_no_name 我认为他的印象是数据库将是跨多个数据库平台的一个应用程序实例,而不是任何可能的数据库平台上的多个实例。 在任何可能的数据库平台上都有多个实例 - 这是正确的。 @BaconBits:啊。我认为它应该是一个独立于 DBMS 的解决方案,使用尽可能少的语句将行存储在单个 DBMS 中。以上是关于如何在一个数据库命中中将多个插入或更新推送到一起 - 对于多数据库(SQL Server、Oracle、MySQL 和 PostgreSQL)应用程序的主要内容,如果未能解决你的问题,请参考以下文章