问题标签 [refactoring-databases]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 重构 SQL 投影?
如果可以避免的话,我不喜欢在两个地方定义相同的东西。
我意识到下面的两个查询正在处理两个不同的表,但这些表包含基本相同类型的数据(不同的谓词保证两个查询),我认为下面的两个投影是“在两个地方定义的相同事物” .
当/如果我稍后修改这些查询以包含不同的列时,我确信我总是希望投影保持相同。
鉴于此,并且不使用动态 SQL,并且在任何投影中都没有“*”(在我的生产环境中不允许),我可以定义一次“列集”并在两个查询中使用它吗?
sql-server - 大量更改数据类型并重命名相关存储过程变量
我正在优化我的数据库,我正在考虑将表上某些列的数据类型从 DATETIME 更改为 SMALLDATETIME。
是否有一个系统存储过程返回存储过程的内容/代码和依赖表,然后允许我对过滤的表列表进行连接?
干杯!
编辑1:
我希望以编程方式重命名存储过程而不是跟踪依赖关系!
sql-server - 记录数据库表、函数、存储过程、视图等的使用情况
我在一个基于 SQL Server 数据库的系统上工作,该数据库已经开发了很多年。它的数据量不是很大(几 GB),但它有很多复杂性(数百个表,数百个存储过程)。
我想从清理不再使用的东西开始。我们有一个每周/每月/每季度/每年的周期,这意味着有些东西一年都不会使用。但是,如果有几个月没有使用的东西的简短列表,我们也许可以通过检查来决定它们是否仍然有用。
我的意图是开始记录对所有数据库对象的访问。我有一些想法,但我想要的是一个日志,我可以把它变成一个没有被使用的东西的列表。我有一些想法,但我需要一些专家的帮助。
编辑:我还想澄清一下,我想查看对表/视图的访问以及存储的过程和函数。
sql-server - 数据库中有多少表/存储过程/函数太多了?
我对数据库重构感兴趣。我处理了几个没有大量数据的数据库,只有几 GB,最多有几十万行。然而,它们有数百个——有时是数百个——表、视图、存储过程和函数。在某些地方,已经实施了使用模式的分而治之策略,这有助于解决查看表的所有权/使用情况的一些问题。然而,它并没有真正帮助对象耦合。
我们都读到通过共享数据库进行集成并不是一件好事,但我们也知道,至少在一段时间内,这是一件非常有成效的事情,因为一切都在数据库中。我们只是不像对对象那样将单一职责原则应用于数据库。
编辑:我应该补充一点,我没有数据库性能问题。表并不大,最大的只有几十万行。没有真正的数据库性能问题;除非数据库模式/逻辑/实现效率非常低下(比如需要游标对结果集中的每一行执行存储过程,以便为报告预处理数据)。在您说我应该更改这些之前,重点是:我不能,因为数据库不再处于可以评估更改影响的状态。
很明显,您有时会说“够了!” 并划分为通过消息、ETL、应用层等连接的多个数据库
问题是:多少才算太多?在你发疯之前,你可以拥有的 sprocs/tables/functions 数量的绝对上限是多少?
sql - 是否存在版本控制数据库存储引擎?
我只是想知道是否存在允许您对行级内容进行版本控制的存储引擎类型。例如,如果我有一个带有 ID、名称、值和 ID 是 PK 的简单表,我可以看到第 354 行以 (354, "zak", "test")v1 开始,然后更新为 (354, "zak", "this is version 2 of the value")v2 ,并且可以在行上看到更改历史记录,例如选择历史记录(值),其中 ID = 354。
这是一种深奥的事情,但每次进行更改时都必须继续编写这些单独的历史表和函数......
sql-server - 在 sql server 中,有没有办法检查架构更改是否会影响存储的过程?
在 SQL Server 中,有没有办法检查架构中的更改是否会影响存储过程(和/或视图)?
例如更改一个表中的列名,可能会破坏一些存储过程;如何检查受影响的存储过程?
sql - SQL,如何在不破坏其他依赖关系的情况下更改 SQL 表中的列?
我确信这可能是很常见的查询,但目前找不到好的答案。
这是我的问题:
我有一个名为Contacts的表,其中包含 varchar 列Title。现在在开发过程中,我想用TitleID替换字段Title ,它是ContactTitles表的外键。目前表Contacts有超过 60 个依赖项(其他表、视图函数)。
我怎样才能以最安全和最简单的方式做到这一点?
我们用的是:MSSQL 2005,数据已经迁移了,只是想改一下schema。
编辑:
感谢所有人的快速重播。
就像之前提到的那样, Contacts表有 60 多个受抚养人,但是在运行以下查询时,其中只有 5 个使用Title列。迁移脚本已运行,因此无需更改数据。
/*gets all objects which use specified column */
SELECT Name
FROM syscomments sc
JOIN sysobjects so ON sc.id = so.id
WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'
然后我浏览了这 5 个视图并手动更新了它们。
mysql - MySQL 加密的最佳实践?
我正在寻找有关为 MySQL 加密字段(和/或表,如果可能)的指导。我会接受一个体面的教程,但我真的很想要一些关于管理从未加密模式到使用加密字段的转换的具体技巧。谢谢!
mysql - 在数据库之间移动表
为了稍微清理一下,我在 MySQL 数据库(不同的硬件)之间移动 25 个表。这不是整个数据库,只有几百个表中的 25 个......这些表并不真正属于那里,出于 NDA 的原因,我不会详细说明原因。
现在,这将破坏很多代码和 sql 查询。
这样做的最佳方法是什么?
一次将它们全部移动。
将它们逐个移动
--
一次将它们全部移动,有点好。可能是我错过了一些中断和损坏的代码,但是将它们作为一个块移动要快得多,花费在推出代码上的时间也更少。
将它们一个一个地移动是一种不错的方式,大东西破坏的可能性较小,但更多的时间将花在微观管理工作、冗余工作和部署上。
我可以在两个数据库之间镜像一段时间的表吗?也许是联合表?
--
杂项信息:有 25 个表都按内容相互关联。
我不能一次关闭数据库几个小时,大约 5 分钟的停机时间是可以接受的。
--
移动所有这些数据并使代码、sql 和我保持良好状态的最佳方法是什么?
我可以联合这些表作为将表复制到新数据库的一种方式吗?
-丹尼尔
sql-server - 创建 SQL Server 触发器以从自然键转换为代理键
背景故事
在我们计划在我们的一个主表中弃用自然键列的工作中。该项目包含 100 多个链接到此表/列的应用程序;400 多个直接引用此列的存储过程;以及这些应用程序之间的大量公用表也引用了此列。
生活大爆炸和从头开始的方法不在图片中。我们将一次弃用本专栏一个应用程序,验证更改,然后继续下一个……我们有一个长期的目标来使这项工作切实可行。
我遇到的问题是很多这些应用程序都有共享的存储过程和表。如果我完全转换应用程序 A 的所有表/存储过程,应用程序 B 和 C 将被破坏,直到转换。这些反过来可能会破坏应用程序 D、E、F...等。我已经为代码类和存储过程实现了一个策略,我坚持的部分是数据库的转换状态。
这是我们所拥有的基本示例:
我们现在的目标只是像这样的过渡状态:
在过渡阶段的想法是,未迁移的应用程序和存储过程仍然能够访问所有适当的数据,并且新的数据可以开始推送到正确的列——一旦所有存储过程和应用程序的迁移完成,我们终于可以删除额外的列。
我想使用 SQL Server 的触发器自动拦截任何新的插入/更新,并对每个受影响的表执行以下操作:
问题
到目前为止,我遇到的两个大问题是:
- 我不能执行“AFTER INSERT”,因为 NULL 约束会使插入失败。
- 我提到的“不可能的代码”是我希望如何干净地代理原始查询;如果原始查询中有 x、y、z 列或只有 x,理想情况下我希望使用相同的触发器来执行这些操作。如果我添加/删除另一列,我希望触发器保持功能。
任何人都有一个可能的代码示例,或者即使只有一个值传递给 SQL,也可以使用另一种解决方案来保持这些列正确填充?