0

我继承了一个数据库设计,它有一个重要的缺陷:核心表的主键(大约有一半的其他表引用,其中许多具有检查它的约束)是 varchar(20)。

这让我有点困惑,但其背后的理由是明智的。数字(迄今为止,它们一直是数字)是两个数据字段的组合(在组合时保证是唯一的),但通常以一个或多个 0 开头。

我确信有更好的方法来解决这个问题,但是数据库模式的完整更改目前超出了范围。

问题是我们有一个新客户,他的 ID 组合为 25 个字符。

当我们为这个客户的站点创建数据库时,我更新了所有字段。这花了我一天的大部分时间——我在表创建/修改级别上对 SQL 做的不多,大约有 25 个表引用了这个字段(以及十几个或更多的存储过程,它们将它的值作为参数)并且每个表都有许多必须删除的约束,以便可以编辑表。

总的来说,更新一个数据库几乎花了我一整天的时间。这是一项漫长而无聊的工作,但一个错误可能会破坏数据库架构。我必须编写一个脚本,以正确的顺序从表中删除约束,更新所有字段,并重新添加所有约束。

有没有更简单的方法来做到这一点?我必须更改主键的字段长度,该主键也是 20-25 个表上的外键,并且我必须为大约 8 个不同的数据库执行此操作。约束在每个数据库上的名称略有不同,因此我的脚本不适用于其他数据库。

4

1 回答 1

1

有两种方法。

第一的

不推荐并且非常“侵入性”。

所有模式都存储在 tablesys中,您可以在其中找到tablescolumns以及其他表。您必须准备一个UPDATE查询来更改所需的值 - 这将直接影响表、模式、列以及您想要的任何内容。

但这并不是微不足道的,因为不允许任何人更新/删除 sys 表。有一些解决方法,但我没有自己尝试任何一种。

第二

从数据库的信息架构中收集要更改的表:

SELECT 'ALTER TABLE ' + TABLE_NAME + ' ALTER COLUMN ' + COLUMN_NAME + ' ' + DATA_TYPE + '(100)' AS [Edit],
    TABLE_NAME,
    COLUMN_NAME,
    CASE
        WHEN CHARINDEX('numeric',DATA_TYPE) <> 0 THEN DATA_TYPE + '(' + CAST(NUMERIC_PRECISION AS varchar) + ', ' + CAST(NUMERIC_SCALE as varchar) + ')'
        WHEN CHARINDEX('varchar',DATA_TYPE) <> 0 THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH as varchar) + ')'
        ELSE DATA_TYPE
    END AS TYP
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_NAME like '%'
AND TABLE_SCHEMA like '%'
AND CASE
        WHEN CHARINDEX('numeric',DATA_TYPE) <> 0 THEN DATA_TYPE + '(' + CAST(NUMERIC_PRECISION AS varchar) + ', ' + CAST(NUMERIC_SCALE as varchar) + ')'
        WHEN CHARINDEX('varchar',DATA_TYPE) <> 0 THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH as varchar) + ')'
        ELSE DATA_TYPE
    END = 'varchar(50)'

调整它,运行它,复制 [Edit] 列并将其粘贴到 SSMS 并再次运行。

于 2013-09-25T14:03:15.783 回答