Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Здравствуйте
Ситуация: Дали задание сделать клон одной БД, но что бы все пользовательские таблицы были пустые, причем что бы все ограничения и триггеры остались.
Как это можно сделать?
Пробовал:
писал следующее:
USE [RTP_K]
--собираем нужный нам список таблиц
declare @t table (n varchar(1000),id int identity)
insert INTO @t (n)
SELECT distinct pdoct 
	from rtping.dbo.umcdocs 
	where isnull(pdoct,'')<>'' 
		AND pdoct NOT IN (SELECT distinct pdoct from umcdocs where isnull(pdoct,'')<>'') --тут список нужных таблов для клиенской части
		AND pdoct NOT IN (SELECT name FROM sysobjects WHERE type = 'U')
		AND pdoct NOT like '%#%'
union all
SELECT distinct pdocmatt 
	from rtping.dbo.umcdocs 
	where isnull(pdocmatt,'')<>''
		and pdocmatt NOT IN (SELECT distinct pdocmatt from umcdocs where isnull(pdocmatt,'')<>'')--тут список нужных таблов для клиенской части
		AND pdocmatt NOT IN (SELECT name FROM sysobjects WHERE type = 'U')
		AND pdocmatt NOT like '%#%'
--пробуем зачистить
declare @str varchar(8000),@i int,@n int
select @str='',@i=1,@n=MAX(id) FROM @t
	while @i<=@n
		begin
		select @str=''
			if exists(select * from sysobjects where NAME like (select n+'_h' from @t where id=@i))
				begin
				select @str='ALTER table '+n+'_h disable trigger all' FROM @t where id=@i
				select @str=@str+' ALTER TABLE '+n+'_h NOCHECK CONSTRAINT ALL' FROM @t where id=@i
				SELECT @str=@str+' delete from '+n+'_h' from @t where id=@i
				select @str=@str+' ALTER table '+n+'_h ENABLE trigger all' FROM @t where id=@i
				EXEC (@str)
SELECT @i --проверочный вывод
				end
  			  else
				BEGIN
				select @str='ALTER table '+n+' disable trigger all' FROM @t where id=@i
				select @str=@str+' ALTER TABLE '+n+' NOCHECK CONSTRAINT ALL' FROM @t where id=@i
				SELECT @str=@str+' delete from '+n from @t where id=@i
				select @str=@str+' ALTER table '+n+' ENABLE trigger all' FROM @t where id=@i
				EXEC (@str)
				end
SELECT @i --проверочный вывод
		SELECT @i=@i+1
		end

скрипт собран наскоро, поэтому не цепляйтес пож к тому что вот тут можно было бы и по быстрее, вопрос не в этом
Вопрос в том, что при удалении он ругается на констрейны, НО данные-то всё равно нужно зачистить
29 апр 15, 06:52    [17579007]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
R-Magistr,

Хотя нет, ругайтесь ))) надо же учиться писать нормальные скрипты )))
29 апр 15, 07:04    [17579017]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
R-Magistr,

Если UNION ALL заменить на просто UNION, то DISTINCT будет не нужен.
Если добавить разделителей батчей GO, и EXEC (@str) заменить на PRINT @str, то получится скрипт, который можно запускать N раз. При каждом запуске будет очищаться часть таблиц, которым констрейнты не мешают, при следующем ещё часть и т.д., до полного просветления.
29 апр 15, 07:38    [17579045]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Guf
R-Magistr,

Если UNION ALL заменить на просто UNION, то DISTINCT будет не нужен.
Если добавить разделителей батчей GO, и EXEC (@str) заменить на PRINT @str, то получится скрипт, который можно запускать N раз. При каждом запуске будет очищаться часть таблиц, которым констрейнты не мешают, при следующем ещё часть и т.д., до полного просветления.


У меня он куча ошибок повыдовал, куда именно по тексту нужно вставить GO ?
29 апр 15, 07:47    [17579052]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
А обратно кто будет CONSTRAINT-ам CHECK делать ?
29 апр 15, 08:32    [17579111]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
А обратно кто будет CONSTRAINT-ам CHECK делать ?

Здравствуйте, Глори, что вы имеете ввиду?
29 апр 15, 08:57    [17579171]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Glory
А обратно кто будет CONSTRAINT-ам CHECK делать ?

Здравствуйте, Глори, что вы имеете ввиду?

Вы не заметили у себя в скрипте ALTER TABLE '+n+' NOCHECK CONSTRAINT ALL ?
Или не считаете нужным производить действия, обратные это команде ?
29 апр 15, 09:02    [17579187]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
А обратно кто будет CONSTRAINT-ам CHECK делать ?


Учёл замечание, делаю
29 апр 15, 09:06    [17579208]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory,

The DELETE statement conflicted with the REFERENCE constraint "FK_ACCREMNS_ACCOUNT". The conflict occurred in database "RTP_K", table "dbo.ACCREMNS_h", column 'ACCOUNT'.


Вот такую штуку мне всё равно пишет
29 апр 15, 09:08    [17579214]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Вот такую штуку мне всё равно пишет

Еще бы он не писал. Если ссылочная целостность объявлена, то ее надо соблюдать
29 апр 15, 09:09    [17579220]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory,

а как изменить все FK на каскадное удаление?
29 апр 15, 09:22    [17579270]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Зачем городить огород. Возьмите любой схема компаратор и накатите схему на пустую БД - получите то что хотите. А если это нужно делать постоянно - что ж в тех же схема компараторах есть командная строка и такое понятие как проект.

Если мысль такая имеет смысл смотрите в сторону - RedGate/DevArt Schema Compare
29 апр 15, 09:28    [17579307]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Glory,

а как изменить все FK на каскадное удаление?

Вы не поверите - командой ALTER TABLE
А обратно в предыдущее состояние как будете приводить каскадные ограничения ?
29 апр 15, 09:41    [17579390]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Идея:

declare @tables table(tablename varchar)
select tablename into @tables from dbo.database.tables
@cnt0 = 1
@cnt1 = 0
while @cnt0 <> @cnt1
  set @cnt1 = @cnt0
  set @cnt0 = 0
  for each @tableX in (@tables order by rnd)
    select count(*) into @cnt2 from @tableX
    set @cnt0 = @cnt0 + @cnt2
    if @cnt2 > 0 then 
      delete from @tableX
    end if
  next @tableX
end while
if @cnt0 = 0 then
  /* удалили всё */
else
  /* удалили не всё */
end if


Т.е. пробуем очистить все таблицы, и считаем суммарное количество записей в них. Если нет такого, что триггеры в архивных целях гоняют записи по кругу разных таблиц - после нескольких итераций количество оставшихся записей стабилизируется на некоем значении. Если оно окажется ненулевым - то либо триггеры препятствуют удалению, либо, например, таблица ссылается на саму себя... но это будет от силы пара таблиц, кои проще зачистить руками.
29 апр 15, 09:43    [17579414]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
Glory,

а как изменить все FK на каскадное удаление?

Вы не поверите - командой ALTER TABLE
А обратно в предыдущее состояние как будете приводить каскадные ограничения ?


Да я нашёл, не могу сообразить как конкретно написать ((
29 апр 15, 09:48    [17579458]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
Glory,

а как изменить все FK на каскадное удаление?

Вы не поверите - командой ALTER TABLE
А обратно в предыдущее состояние как будете приводить каскадные ограничения ?


есть что-то типо

ALTER table ACCOUNT_h alter CONSTRAINT FK_ACCOUNTANALIT_ACCOUNT ON DELETE CASCADE


а обратно

ALTER table ACCOUNT_h alter CONSTRAINT FK_ACCOUNTANALIT_ACCOUNT ON DELETE NO ACTION
29 апр 15, 09:55    [17579506]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
а обратно

А откуда вы узнаете, как было до вас ?
29 апр 15, 09:56    [17579510]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory,

Что, ни как что ли?
вроде как по умолчанию ON DELETE NO ACTION
29 апр 15, 09:58    [17579521]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
вроде как по умолчанию ON DELETE NO ACTION

И что ? По-умолчанию дает гарантию, что именно так было до вашего вмешательства ?

Тоже самое и с триггерами - откуда вы знаете, какие из них были разрешены/запрещены для каждой из ваших таблиц ?

R-Magistr
Что, ни как что ли?

Сюрприз что ли ?

Сообщение было отредактировано: 29 апр 15, 10:03
29 апр 15, 10:02    [17579547]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
вроде как по умолчанию ON DELETE NO ACTION

И что ? По-умолчанию дает гарантию, что именно так было до вашего вмешательства ?

Тоже самое и с триггерами - откуда вы знаете, какие из них были разрешены/запрещены для каждой из ваших таблиц ?

R-Magistr
Что, ни как что ли?

Сюрприз что ли ?


Глори, спасибо, один вопрос, чё язва-то такая ? ))) Без обид только ))
29 апр 15, 10:39    [17579784]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Глори, спасибо, один вопрос, чё язва-то такая ? ))) Без обид только ))

Потому что дурацкий способ решения задачи
Клонирование базы делается через получение скриптов объектов
29 апр 15, 10:41    [17579792]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
Глори, спасибо, один вопрос, чё язва-то такая ? ))) Без обид только ))

Потому что дурацкий способ решения задачи
Клонирование базы делается через получение скриптов объектов


Нашёл хелп по копированию структуры БД
при выполнении скрипта по копированию структуры БД, он (скрипт) скопирует триггеры, таблицы без данных и все ключи?
29 апр 15, 10:50    [17579841]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
он (скрипт) скопирует триггеры, таблицы без данных и все ключи?

А в хелпе не написано ?
29 апр 15, 10:52    [17579855]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
он (скрипт) скопирует триггеры, таблицы без данных и все ключи?

А в хелпе не написано ?


Написано просто копирование структуры, поэтому и спрашиваю ))))
29 апр 15, 10:53    [17579859]     Ответить | Цитировать Сообщить модератору
 Re: Чистка всех таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Написано просто копирование структуры, поэтому и спрашиваю ))))

Ии вы в состоянии процитировать это "написано просто" ?
29 апр 15, 10:56    [17579880]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить