【问题标题】:insert directly or via a stored procedure直接插入或通过存储过程插入
【发布时间】:2011-03-17 08:50:31
【问题描述】:

我正在为我的应用程序使用 sql server 和 winforms。通过按下表单上的按钮,每分钟都会将数据插入到数据库表中。

为此,我使用了 INSERT 查询。

但是如果我创建一个过程并在其中包含相同的插入查询,那么它会更有效吗,那会有什么区别?

【问题讨论】:

  • “每分钟都会插入数据……通过按下表单上的按钮”。 “每分钟”部分听起来很可疑。为什么不将人机交互排除在外,而只需使用自动计时器触发插入呢?如果您无法实现自动化(因为必须由人工创建数据),他们是否需要每分钟都执行此操作,或者这仅仅是关于您收到请求的频率?
  • @Merlyn Morgan-Graham——我的意思是该应用程序将管理一家大型公司的销售,因此当一件商品被售出时,人们会立即将其条目输入数据库。每分钟我的意思是,因为它是一家大型公司,所以很明显它非常频繁地销售商品

标签: c# sql-server-2005 tsql stored-procedures


【解决方案1】:

使用存储过程更安全

【讨论】:

  • 您能否提供更多信息,以哪种方式更安全?
  • 如果您允许用户调用存储过程,则该用户只需要对该存储过程的 EXECUTE 权限 - 该用户不需要对基础表具有 INSERT、UPDATE、DELETE 权限这使得它更安全(如果该用户应该启动 Access 或 Excel 并尝试直接使用数据库)
  • 更多的是关于Web开发,但用户可以使用SQL注入技术。在插入语句中使用用户输入的数据之前,您需要清理您的输入。存储过程接收所有用户的输入作为参数,因此 SQL 注入是不可能的。此外,可以在数据库中更改存储过程,而无需重新编译应用程序。他们可以从各种 SQL 优化中受益
【解决方案2】:

存储过程通常会更快,因为存储了查询计划并且不需要为每次调用创建。如果这是一个简单的插入,则差异将很小。

可以使用执行权限运行存储过程,这比授予用户插入权限更安全。

【讨论】:

  • 不是真的——一旦参数化查询被解析,它的执行计划也会被缓存,所以存储过程真的没有明显的速度优势了
【解决方案3】:

这取决于你所说的“高效”。

  • 执行时间 - 如果您只是每隔几秒才将数据保存到数据库中,那么 SP 和 INSERT 之间的任何速度差异很可能是微不足道的。如果音量特别高,您可能会在此级别进行微调之前在服务器上设置命令队列之类的东西。
  • 开发时间
    • 使用 INSERT 意味着您可以直接在代码库(存储库或类似的)中编写 SQL。我已经看到这被描述为糟糕的设计,但我认为只要您围绕查询进行集成测试,就没有真正的问题
    • 存储过程可能更难维护 - 您需要制定将新 SP 部署到数据库的计划。好处是您可以在数据库本身上实现更细粒度的安全性(正如@b-rain 和 @mark_s 所说),并且很容易在 SP 内决定 INSERT 和 UPDATE,而在代码中执行相同操作意味着确定假设。

我个人(目前)使用内联 SQL 进行查询和删除,并使用存储过程进行插入。我有一个脚本和一组迁移文件,我可以针对生产数据库运行它们以部署表和 SP 更改,这似乎工作得很好。我还对内联 SQL 和 SP 调用进行了集成测试。如果您使用内联 SQL,则绝对应该使用参数化查询,它有助于抵御 SQL 注入攻击,并且更易于阅读和编程。

【讨论】:

  • 我有一个简单的查询:INSERT INTO items values()——这将通过单击 winform 上的按钮由人类运行,但非常频繁,即每分钟。所以应该只使用这个查询或者在过程中给出它
  • 参数化查询指的是这种类型的查询,DECLARE @itemname SET @itemname =textbox1.Text; “插入项目值(@itemname)”。请给我一个例子,因为我认为这里错了
  • @sqlchild 是的,这是错误的。您可以像var cmd = new SqlCommand("INSERT INTO items VALUES(@itemname)" 一样声明命令,然后使用cmd.Parameters.Add() 添加参数。尝试使用谷歌搜索“c# 参数化查询”。
  • @sqlchild 如果您只是插入项目而不更新它们(这对于前端销售系统来说听起来不错),我可能会使用内联查询,如果需要改变。
  • 非常感谢先生,是的,我的应用程序是针对医疗商店的,所以您更喜欢在 cmd.Parameters.Add(textBox1.Text) 中使用参数化查询 --- 这样我会添加参数
【解决方案4】:

如果您的 DBA 甚至允许您在没有存储过程的情况下执行此操作,我会非常怀疑...

【讨论】:

  • 先生,您的意思是插入应该通过存储过程而不是直接通过插入查询。因为最终用户会将来自 winform 应用程序的数据插入到数据库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多