Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Очистка всех данных из БД  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
Этот скрипт определяет последовательность зависимостей таблиц (по внешних ключах) и удаляет данные из всех пользовательских таблиц в корректной последовательности.

Подумал, может кому-то пригодится...

-- create 2 helper tables: #tables and #deleteorder 


if exists(select * from tempdb.dbo.sysobjects where name like '#tables%')
drop table #tables
go
create table #tables(
id int, -- id of the table

name varchar(255), -- name of the table

refOnMe int -- how many other tables are referencing this one

)
go
if exists(select * from tempdb.dbo.sysobjects where name like '#deleteorder%')
drop table #deleteorder
go
create table #deleteorder(
id int, -- id of the table

name varchar(255), -- name of the table

delorder int -- deleting order

)
go

-- build the ordered sequence of all user tables and store it in #deleteorder

set nocount on

declare @order as int
select @order=1

while 0=0
begin
delete from #tables

insert into #tables
select
id,
name,
(select count(*)
from sysreferences r1
where
r1.rkeyid = so.id and
r1.fkeyid not in (select id from #deleteorder)
) as refonme
from sysobjects so
where
so.xtype = 'u'
and so.name <> 'dtproperties'
and so.id not in (select id from #deleteorder)

if @@rowcount=0 and @order>1
break

insert #deleteorder
select id, name, @order
from #tables where refOnMe = 0

select @order = @order+1
end
set nocount off

-- deleting all information in the tables

declare @name varchar(255)
declare cur cursor for
select name from #deleteorder order by delorder
open cur
fetch cur into @name
while @@fetch_status = 0
begin
print @name
exec('delete from '+@name)
fetch cur into @name
end
close cur
deallocate cur
drop table #tables
drop table #deleteorder
14 апр 03, 18:16    [173897]     Ответить | Цитировать Сообщить модератору
 Re: Очистка всех данных из БД  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145721
Отправьте в FAQ
14 апр 03, 19:33    [173957]     Ответить | Цитировать Сообщить модератору
 Re: Очистка всех данных из БД  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
можно проще

exec sp_msforeachtable N'

alter table ? nocheck constraint all
alter table ? disable trigger all
delete from ?'


единственная проблема - на больших базах будет оооочень большой Transaction Log.

В прочем, в приведенном примере, он тоже будет не маленьким.

Если подумать, то можно добавить скрипт так, чтобы он сохранял все констрейнты, после этого убивал их, а затем использовать truncate table вместо delete from.
14 апр 03, 19:56    [173962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить