【发布时间】:2013-12-26 17:49:05
【问题描述】:
在 Microsoft SQL Server 2008 R2 中,我想将可为空的列更改为不为空。显然,我可以通过重述数据类型来做到这一点,如
alter table t alter column c int not null
例如,如果列 t.c 是 int 数据类型。但是一般情况下,如果不重新说明现有数据类型呢?我正在寻找一些等价的
alter table t alter column c not null
现有数据类型保留在原位,并且只有可空性被关闭。
背景
我对我的数据库进行了审计,发现很多情况下,列被指定为可为空,但实际上没有出现空值。我想收紧架构以禁止这些列中的空值。手动将 DDL 写入每个“更改列”很容易出错,因为我可能会弄错数据类型。我可以使用模式转储程序自动生成代码,该程序输出每列的现有数据类型,但这也有风险,如果转储程序不知道最新的数据类型并输出其他内容(例如,假设它不知道 datetime2 而是写出 datetime)。
SQL 服务器已经知道列类型是什么,所以肯定有办法告诉它保留它并关闭可空性。
如果除了找到现有的数据类型将其放入 DDL 之外真的没有其他办法,也许您可以推荐一个合适的工具来使用?我从 Sybase 时代就知道 dbschema.pl,但可能有更现代的东西,或者一些众所周知的 SQL 片段,可以从模式视图中打印出必要的语句。
【问题讨论】:
-
想象一下,如果产品必须处理您可能想要“只是”调整的所有不同的、单一的功能 - 即“如果我只想指定数据类型,为什么我必须指定数据类型?更改长度/比例/精度/排序规则/等” - 对您来说,“只是”调整可空性是您想要做的,但就 SQL 而言,它是数据类型的固有部分,如果您想要更改类型,您必须完全重新指定它。
-
@Damien_The_Unbeliever:我总体上同意你的评论。然而,SQL Server 是少数有此要求的 DBMS 之一。在 Postgres、Oracle、DB2、MySQL 和其他几个中,如果类型本身没有改变,则不需要重复数据类型 - 所以这个问题有点可以理解。
-
您可以使用Information Schema Views 来自动化一些工作,例如编写 TSQL 脚本以供审核。
-
@HABO:确实。困难的部分是找到将信息模式视图反向工程回正确语法'varchar(50)collate database_default not null'等的SQL。除非视图中的某处隐藏了一个列,可让您直接获取此文本?
标签: sql-server types null alter-table alter-column