惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
Forbes - Security
Forbes - Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
V
Visual Studio Blog
月光博客
月光博客
博客园 - Franky
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
博客园 - 司徒正美
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
U
Unit 42
P
Proofpoint News Feed
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
V
V2EX
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
Latest news
Latest news
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
Intezer
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
博客园 - 【当耐特】
B
Blog RSS Feed
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
NISL@THU
NISL@THU
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security

博客园 - nzperfect

PAGELATCH_EX Contention on 2:1:103 SQL Server AlwaysON 同步模式的疑似陷阱 XEvent – SQL Server Log文件对磁盘的写操作大小是多少 SQL Server Log文件对磁盘的写操作大小是多少 Initializing the FallBack certificate failed . TDSSNIClient initialization failed Error after SQL Server 2012 installation: Login Failure for "SQL Server Integration Services 11.0" SSIS service SQL Server 灾难恢复31天之第6天:管理区分配页损坏处理 SQL Server 灾难恢复31天之第5天:处理损坏的非聚集索引 SQL Server 灾难恢复31天之第3天:在还原数据库时确定需要哪些备份文件 SQL Server 灾难恢复31天之第4天:备份 SQL Server 灾难恢复31天之第2天:包含数据库备份在还原时的保护 SQL Server 灾难恢复31天之第1天:DBCC CHECK命令会自动使用已经存在的数据库快照吗? 发布订阅延迟故障排查案例:分发读进程延迟 Query Hint FAST number_rows 改变SQL Server 执行计划 是什么引起执行计划变得极其糟糕? 应该使用更新统计信息来解决它吗? 如何完整的修改一个数据库的名称 update值与原值相同时,SQL Server会真的去update还是忽略呢? How can I bring mirror database online after principal server is down ? performance monitor没有SQL Server性能计数器
SQL Server 通过界面生成修改列类型脚本时的一个风险(或Bug)
nzperfect · 2012-12-26 · via 博客园 - nzperfect

相信,很多网友都有用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造成的数据丢失:

中间部分过程图:


生成的脚本:测试版有限制

总结:生成脚本有风险,使用须谨慎。