【发布时间】:2016-11-04 03:16:17
【问题描述】:
给定一个包含许多表的数据库,我有一个包含多个删除和截断语句的脚本。我的数据库中的每个表都没有删除语句或截断语句。该脚本如下所示(我已更改名称并缩短了长度):
TRUNCATE table db.dbo.table1
TRUNCATE table db.dbo.table2
TRUNCATE table db.dbo.table3
--cannot truncate table because it is being referenced by a FK constraint
--TRUNCATE table db.dbo.table4
--TRUNCATE table db.dbo.table5
--TRUNCATE table db.dbo.table6
--TRUNCATE table db.dbo.table7
DELETE FROM db.dbo.table4
DBCC CHECKIDENT ('db.dbo.table4',RESEED, 0)
DELETE FROM db.dbo.table5
DBCC CHECKIDENT ('db.dbo.table5',RESEED, 0)
DELETE FROM db.dbo.table6
DBCC CHECKIDENT ('db.dbo.table6',RESEED, 0)
DELETE FROM db.dbo.table7
DBCC CHECKIDENT ('db.dbo.table7',RESEED, 0)
DELETE FROM db.dbo.table8
DELETE FROM db.dbo.table9
DELETE FROM db.dbo.table10
DELETE FROM db.dbo.table11
DELETE FROM db.dbo.table12
DELETE FROM db.dbo.table13
DELETE FROM db.dbo.table14
DELETE FROM db.dbo.table15
执行脚本后,我发现正在从未包含在脚本中的表中删除数据。
为了验证哪些表有数据,我使用here 找到的 SO 答案中提供的以下查询。
SELECT
t.NAME AS TableName,
SUM(p.rows) AS [RowCount]
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name
ORDER BY
SUM(p.rows) DESC
我有数据库的备份。接下来我:
- 恢复数据库
- 运行“表数据”查询:再次检查删除/截断脚本中未包含的表中是否确实存在数据
- 执行删除/截断脚本
- 运行“表数据”查询
我的发现是这样的:正在从我的删除/截断脚本中未定义的表中删除数据。
我的问题:鉴于我要从数据库中的多个表而不是所有表中删除或截断,如何从未在删除或截断语句中定义的表中删除数据?
【问题讨论】:
标签: sql-server database sql-delete truncate sql-server-2016