【问题标题】:How to rename SQL table column name(s) and not break stuff如何重命名 SQL 表列名而不破坏内容
【发布时间】:2013-07-27 11:08:13
【问题描述】:

我重新审视了我刚入门时的一些代码,发现一些 SQL 表的列名非常模糊,让我感到畏缩。

现在,如果我继续更改名称,则纠正代码中的所有映射所需的时间和精力在这一点上似乎是不合理的。

我想知道在插入数据库时​​是否可以提供别名?

我问是因为您可以像这样在 SELECT 上使用别名:

SELECT users.id, username, number AS order_number FROM users INNER JOIN orders ON users.id = orders.user_id;

或者有没有人对我如何做到这一点有任何其他建议?

【问题讨论】:

  • 插入语句中不允许使用别名
  • 我也是这么想的。您对更改列名的最佳方法有什么建议吗?还是我只需要硬着头皮更新我的代码?
  • 如何插入?是直接sql执行还是通过java层?

标签: sql refactoring-databases


【解决方案1】:

虽然重构数据库无疑是一项大型且有风险的活动,但这里有一些降低风险的技巧。以下是一些具有各种优缺点的建议(正如我所看到的那样),希望它们会有所帮助。

代码

根据您的编程语言、舒适度和时间框架,您可以使用 RDBMS 独立对象关系映射器(如 Hibernate / NHibernate 等)替换内联直接 SQL。

优点

  • 为未来的数据库重构提供抽象。
  • 可能会提供改进和可重用性。
  • 减少任何 SQL 注入攻击。

缺点

  • 重新编写代码库需要付出很多努力和风险,但您可以采用零碎的方法来完成。
  • 不适用于所有类型的应用程序/服务(例如,报告)。

存储过程

根据您的 RDBMS,您可以使用存储过程为底层数据和模式提供抽象和额外的安全性。

优点

  • 需要维护更多代码。
  • 不容易测试,尽管根据您的 RDBMS 有很多数据库测试框架应该包括 SP 覆盖率。
  • 假设您没有在存储过程中构建任何动态 SQL,则提高了数据安全性并降低了 SQL 注入攻击的风险。

缺点

  • 可被滥用以将您的数据访问与域/业务逻辑交织在一起。
  • 您仍需要更新代码库才能使用存储的过程。

观看次数

您可以将现有表 UsersOrders 重命名为其他名称,并使用视图来提供列名抽象。

优点

  • 为您的选择语句提供一些抽象列别名。
  • 可以快速且相对容易地完成。
  • 如果使用架构绑定/索引视图,可能会提供改进。

缺点

  • 仅限于选择语句。
  • 开发时可能会令人困惑。
  • 不关闭任何针对 SQL 注入攻击的安全措施。
  • 需要维护更多代码。

立面桌 结合视图建议,您可以创建具有修改的列命名和安全访问权限的外观表。当数据插入到外观表中时,使用触发器作为抽象机制来填充旧表。

优点

  • 可以为插入数据提供抽象。

缺点

  • 可能是提供抽象的风险最大的选择。
  • 仅适用于插入语句。
  • 使用直接内联 SQL 时仍然容易受到注入攻击。
  • 您的数据类型可能不支持触发器。
  • 需要维护更多代码。
  • 触发器难以调试,并且由于“隐藏”的性质而经常不受欢迎。

【讨论】:

    【解决方案2】:

    您可以将表格包装在视图中,然后插入到视图中。

    create view view_nice_column_names 
    as
    SELECT bad_name_1 as nice_name_1, bad_name_2_as nice_name_2 FROM blabla
    GO
    
    INSERT INTO view_nice_column_names (nice_name_1, nice_name_2) VALUES ( ...)
    

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多