Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 插入具有默认值的非空列_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 插入具有默认值的非空列

Sql server 插入具有默认值的非空列,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个数据库,用于在web服务器上进行开发和测试。我想做的是向包含大约50000条记录的表中添加一列(请注意,我不是数据库管理员)。我使用提供商提供的凭据通过SSMS连接,并执行下一个查询 ALTER TABLE MyTable ADD MyCol BIT CONSTRAINT MyConstraint DEFAULT 1 NOT NULL 我得到的错误是: 味精9002,第17级,第4状态,第2行 数据库“my_db”的事务日志已满。要了解日志中的空间无法重用的原因,请参阅sys.data

我有一个数据库,用于在web服务器上进行开发和测试。我想做的是向包含大约50000条记录的表中添加一列(请注意,我不是数据库管理员)。我使用提供商提供的凭据通过SSMS连接,并执行下一个查询

ALTER TABLE MyTable
ADD MyCol BIT
CONSTRAINT MyConstraint DEFAULT 1 NOT NULL
我得到的错误是:

味精9002,第17级,第4状态,第2行
数据库“my_db”的事务日志已满。要了解日志中的空间无法重用的原因,请参阅sys.databases中的log\u reuse\u wait\u desc列

如果我执行

SELECT log_reuse_wait_desc, * 
FROM sys.databases WHERE name ='my_db'
GO
在与Add MyCol一起的批处理中,log\u reuse\u wait\u desc将是活动的\u事务。如果我将它作为一个单独的命令执行,它将是CHECKPOINT

数据库的恢复模式设置为简单。我已经在网上搜索了一个解决方案,人们建议将恢复模式设置为简单的(已经是),或者备份日志文件,然后缩小它,这是一些专家认为非常糟糕的实践。 那么,我需要做什么来向包含数据的表中添加简单的NOTNULL列呢

编辑:如果有人不想通读所有答案,下面是解决方案:

要获取事务日志的大小,我是这样做的:

sp_helpdb 'YouDatabaseName'
在结果窗口中,您将获得日志文件的大小(我的是8MB)。要将其增加到更大的值,请使用以下查询:

ALTER DATABASE YourDatabaseName
MODIFY FILE(NAME = YourDatabaseLogName, SIZE=128MB);
GO

错误将消失。

您可以指定日志的大小更大,该消息不会出现。您可以将日志增加到自动增长(或两者都增加),这样SQL Server就可以在执行事务时获得更多空间

请使用此链接作为参考:

可以使用以下命令增大大小:

ALTER DATABASE YourDatabaseName

MODIFY FILE

(NAME = YourDatbase_log,

SIZE = 1500MB);
您可以看到日志文件的大小:

SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = 'DBName'

您可以指定更大的日志大小,以确保此消息不会出现。您可以将日志增加到自动增长(或两者都增加),这样SQL Server就可以在执行事务时获得更多空间

请使用此链接作为参考:

可以使用以下命令增大大小:

ALTER DATABASE YourDatabaseName

MODIFY FILE

(NAME = YourDatbase_log,

SIZE = 1500MB);
您可以看到日志文件的大小:

SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = 'DBName'

这意味着您的日志文件太小,无法增长

添加此列(在本例中,并非总是针对
列)需要对磁盘上的结构进行洗牌,从而生成日志条目,以便可以回滚。备份日志文件并缩小它几乎永远都不是一个好的解决方案:听起来好像已经在这里完成了,因此它太小了。我的意思是非常小,因为50000行很小


您可以使用SQL或GUI增加空间和/或增长。此答案描述了更多内容:

这意味着您的日志文件太小,无法增长

添加此列(在本例中,并非总是针对
列)需要对磁盘上的结构进行洗牌,从而生成日志条目,以便可以回滚。备份日志文件并缩小它几乎永远都不是一个好的解决方案:听起来好像已经在这里完成了,因此它太小了。我的意思是非常小,因为50000行很小


您可以使用SQL或GUI增加空间和/或增长。此答案描述了更多内容:

尝试取消对日志文件大小的限制或增加日志文件:


尝试取消对日志文件大小的限制或增加日志文件:


检查点的描述可以是:

自上次日志截断后未发生任何检查点,或者 尚未移动到虚拟日志文件之外的日志(所有恢复) 模型)。这是延迟日志截断的常规原因

除非手动更改检查点设置,否则这意味着您的日志文件太小。如果可能,允许日志文件增长,或者完全删除最大大小

如果无法增加日志文件大小,可以尝试解决此问题。一种解决方法是将更改拆分为较小的事务。例如:

  • 将列添加为可空(添加可空列是一个小得多的事务)
  • 分小块更新列(例如,一次更新1000行)
  • 将列修改为
    非空

检查点的描述可以是:

自上次日志截断后未发生任何检查点,或者 尚未移动到虚拟日志文件之外的日志(所有恢复) 模型)。这是延迟日志截断的常规原因

除非手动更改检查点设置,否则这意味着您的日志文件太小。如果可能,允许日志文件增长,或者完全删除最大大小

如果无法增加日志文件大小,可以尝试解决此问题。一种解决方法是将更改拆分为较小的事务。例如:

  • 将列添加为可空(添加可空列是一个小得多的事务)
  • 分小块更新列(例如,一次更新1000行)
  • 将列修改为
    非空

如果我没有弄错的话,3d选项(将列修改为非空)将导致表格重新创建。我已经试过了,但没有成功(步骤3中的错误相同)。此外,我没有手动更改任何有关检查点的内容。日志文件位于我们不拥有的web服务器上,因此我不相信我可以更改其大小?请尝试联系拥有该web服务器的公司。正如GBN所回答的,50k行并不多!作为另一种选择,创建一个具有正确定义的新表,并一次移动几行。最后,删除旧表并重命名新表(请参见
sp_rename
)您建议的最后一个是我所做的,但我花了6个小时才完成两个表!首先我做的是任务->为两个表(带数据)生成脚本,然后我删除了它们包含的所有关系,然后在一批中删除了2000个最上面的行。然后我换了颜色