相信,很多网友都有用SQL界面生成脚本再执行的习惯,今天在CSDN看到一个案例,好大的风险-_-!!!
本示例是将一个表的列由datetime变成char型:
step 1 生成数据库:
USE master GO --创建测试数库 CREATE DATABASE [DB_TEST] ON PRIMARY ( NAME = N'DB_TEST', FILENAME = N'D:\SQL2008\Data\DB_TEST.mdf' , SIZE = 512MB , FILEGROWTH = 1024KB, MAXSIZE = 524288KB ) LOG ON ( NAME = N'DB_TEST_log', FILENAME = N'D:\SQL2008\Log\DB_TEST_log.ldf' , SIZE = 1024KB , FILEGROWTH = 1024KB ) GO
step 2 生成表,并生成测试数据
USE [DB_TEST] GO CREATE TABLE TB_TEST (ID INT IDENTITY(1,1) PRIMARY KEY,B DATETIME) GO INSERT INTO TB_TEST SELECT GETDATE() GO 100000
step 3 通过界面修改列类型,然后生成脚本:
生成的脚本为:
BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_TB_TEST ( ID int NOT NULL IDENTITY (1, 1), B char(7000) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_TB_TEST SET (LOCK_ESCALATION = TABLE) GO SET IDENTITY_INSERT dbo.Tmp_TB_TEST ON GO IF EXISTS(SELECT * FROM dbo.TB_TEST) EXEC('INSERT INTO dbo.Tmp_TB_TEST (ID, B) SELECT ID, CONVERT(char(7000), B) FROM dbo.TB_TEST WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_TB_TEST OFF GO DROP TABLE dbo.TB_TEST GO EXECUTE sp_rename N'dbo.Tmp_TB_TEST', N'TB_TEST', 'OBJECT' GO ALTER TABLE dbo.TB_TEST ADD CONSTRAINT PK__TB_TEST__3214EC277F60ED59 PRIMARY KEY CLUSTERED ( ID ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO COMMIT
step 4 然后把生成的脚本拿到ssms query里去执行,悲惧了:
文字为:
Msg 1105, Level 17, State 2, Line 1
无法为数据库 'DB_TEST' 中的对象 'dbo.Tmp_TB_TEST' 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。
Msg 1088, Level 16, State 11, Line 1
找不到对象 "dbo.Tmp_TB_TEST",因为它不存在或者您没有所需的权限。
Msg 15248, Level 11, State 1, Procedure sp_rename, Line 321
参数 @objname 不明确或所声明的 @objtype (OBJECT)有误。
Msg 4902, Level 16, State 1, Line 1
找不到对象 "dbo.TB_TEST",因为它不存在或者您没有所需的权限。
Msg 3902, Level 16, State 1, Line 1
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
step 5 你再去查看表,发现你要修改的表不见了。。
step 6 重新再做一遍,这次我们用界面操作显示如下图,但表没有消失:
step 7 修改生成的脚本,去掉GO,再执行:
虽然报错了,但可以看到表还在。
step 8 尝试用ApexSQL Recover恢复一下:
选择由于Drop table造成的数据丢失:
中间部分过程图:
生成的脚本:测试版有限制
总结:生成脚本有风险,使用须谨慎。
作者:nzperfect
出处:http://www.cnblogs.com/nzperfect/
引用或者转载本BLOG的文章请注明原作者和出处,并保留原文章中的版权信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现