当前位置: 首页 > 面试题库 >

SQL:避免硬编码或幻数

司空鸿熙
2023-03-14
问题内容

问: 在SQL脚本或存储过程中,避免幻数或硬编码值还有哪些其他策略?

考虑一个存储过程,该存储过程的工作是根据其StatusID或某些其他FK查找表或值的范围来检查/更新记录的值。

考虑一个Status表,其中ID最重要,因为它是另一个表的FK:

替代文字

应避免的SQL脚本 如下所示

DECLARE  @ACKNOWLEDGED tinyint

SELECT  @ACKNOWLEDGED = 3   --hardcoded BAD

UPDATE  SomeTable
SET     CurrentStatusID = @ACKNOWLEDGED
WHERE   ID = @SomeID

这里的问题是,这不是可移植的,并且显式依赖于硬编码的值。在将其部署到另一个没有标识插入的环境时,存在细微的缺陷。

还尝试避免SELECT基于文本的描述/名称的状态:

UPDATE  SomeTable
SET     CurrentStatusID = (SELECT ID FROM [Status] WHERE [Name] = 'Acknowledged')
WHERE   ID = @SomeID

问: 在SQL脚本或存储过程中,避免幻数或硬编码值还有哪些其他策略?

关于如何实现此目标的其他一些想法:

  • 添加一个新bit列(名称类似“ IsAcknowledged”)和一组规则,其中只能有一个值为的行1。这将有助于找到唯一的行:SELECT ID FROM [Status] WHERE [IsAcknowledged] = 1)

问题答案:

在某种程度上,将会有一些“硬编码”的值。消除它们的想法来自两个方面:

  1. 使代码更具可读性(即说'Acknowledged'而不是说3可能 会使您的意图对读者更加明显。
  2. 使代码更具动态性,其中一个函数可以带参数而不是多个不带参数的函数(显然,这是一种简化,但是无论如何含义都应该是不言而喻的)

使bit列各种状态可以是好还是坏主意;
它实际上仅取决于数据。如果数据经过不同的“阶段”(收稿时承认,在审查,拒绝,接受,回应道,等),那么这种做法迅速扩展自身出活力(更何况有保证的刺激性过程
只有一个 的在任何给定时间将列设置为1)。另一方面,如果状态确实如您所描述的那样简单,则这样做可以使代码更具可读性,并且索引的性能更好。

硬编码值中最大的否定是 引用其他实体的硬编码值
(换句话说,硬编码对应对象的主键)。字符串'Acknowledged‘仍然是一个硬编码的值,它的含义更加透明,并且不是对其他内容的引用。对我来说,可以归结为:
如果可以(合理地)查找它,那就去做吧
。如果不能(或者从性能或可维护性的角度来看,使它成为不合理的任务),请对其进行硬编码。使用它,您可以使用来查找3的值Acknowledged。你不能Acknowledged从其他任何东西抬头。



 类似资料:
  • 问题内容: 我正在编程一个通用的缓存机制,我需要在结构中设置一些属性,这些结构只知道它们的reflect.Type,属性名称和reflect.Value可以在属性中设置,但我无法避免类型断言,这使得我的代码不是通用的… 前往Playground解决问题(通过硬编码类型断言工作)… 前往Playground解决问题(不适用于未知界面) 问题答案: 最终,我找到了一种方法。请遵循下面的Go Playg

  • 我开发了一个Atlasian Bitbucket插件,它在全局上监听push/pr并使用REST API向数据库发送存储库详细信息。 我需要配置和,以便我的插件可以进行API调用。目前,我的插件属性文件中有和。我不喜欢这样做,因为每次如果我需要创建一个包来针对我的测试环境或生产,我都必须进行更改。此外,我不喜欢在源代码中保留凭据。 在bitbucket插件中添加配置屏幕的最佳方法是什么?我想有一个

  • 问题内容: 我有一个PostgreSQL的AWS RDS实例,在该实例中,我需要使用并且以该角色(我创建的)登录时在函数内执行一条语句。 的是生产以下错误消息: 我找到了建议使用的答案。当我尝试这样做时,我收到以下错误消息: 在AWS上,如何授予创建RDS实例的用户执行功能的权限?我尝试了以下操作,但未成功: 看来我的用户需要我显然无法在AWS上获得的权限。 我也曾使用(在Windows上)提供密

  • 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的

  • 问题内容: 我知道PreparedStatements避免/防止SQL注入。它是如何做到的?使用PreparedStatements构造的最终表单查询是否为字符串? 问题答案: SQL注入的问题在于,用户输入被用作SQL语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果您不使用用户输入作为已准备好的语句的参数,而是通过将字符串连

  • 问题内容: 我知道PreparedStatements可以避免/防止SQL注入。它是如何做到的?使用PreparedStatements构造的最终表单查询是否为字符串? 问题答案: SQL注入的问题在于,用户输入被用作SQL语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果您不使用用户输入作为已准备好的语句的参数,而是通过将字符