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

Откуда:
Сообщений: 76
Если вдруг кто уже решал данную задачу и сохранился скрипт.
Необходимо включить каскадное удаление по всем связям в базе данных (кроме естественно связей таблицы саму на себя).

По глобальному решаю вопрос удаления большого количества связанных данных из базы.
решил что способ каскадное удаление + триггера на удаление там где каскадное удаление включить нельзя будет самым оптимальным.
18 сен 12, 18:51    [13184550]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А если будет:

A -> B -> C -> A

-> B ->
A - - D
-> C ->

Тогда не-включать каскадное удаление, на какой из FK?

Не всегда нужно каскадное удаление, точнее вредно. На справочники вообще нельзя. Всё равно лучше перелопатить внимательно.
И что вам мешает написать простой скрипт на основании INFORMATION_SCHEMA и FOR XML?
Учитесь.
18 сен 12, 20:03    [13184907]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Dzianis
Member

Откуда:
Сообщений: 76
Mnior
И что вам мешает написать простой скрипт на основании INFORMATION_SCHEMA и FOR XML?
Учитесь.

спасибо за совет. Мешает написать интерес в том, что может его кто уже писал.
18 сен 12, 23:03    [13185546]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Dzianis
Мешает написать интерес в том, что может его кто уже писал.
Такое можно услышать от пользователя, но не программера. IMXO

Да писал, тока вот скрипты не рядом да и банально лень выкусывать, я б даже сам с нуля написал бы.
19 сен 12, 00:35    [13185798]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Col
Member

Откуда: Торонто
Сообщений: 180
Вот это было "настрогано" "по быстрому". т.е. время совсем небыло на обдумывание.
Подход в корне неверный, но Вы ищите некий пример...

SELECT TBLNAME INTO #TEMP
 FROM
(SELECT DISTINCT t.name AS TBLNAME,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name = 'edit_this'
) v  
go

DECLARE @QUERY NVARCHAR(MAX)

SET @QUERY = ''
SELECT    @QUERY = @QUERY + 'WHILE(1=1)
BEGIN
DELETE TOP(5000) FROM ' + name + ' WHERE edit_this NOT IN (SELECT edit_this FROM save_data)
IF @@ROWCOUNT < 1 BREAK
END

'
FROM    sysobjects 
WHERE name IN (SELECT TBLNAME FROM #temp)

PRINT @QUERY
--EXEC sp_executesql  @QUERY
go

DROP TABLE #TEMP
go


Прогонять несколько раз, пока не порубит из всех возможных...
19 сен 12, 04:51    [13185929]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Dzianis
Member

Откуда:
Сообщений: 76
Mnior
Такое можно услышать от пользователя, но не программера. IMXO


Как говорится ваш комментарий очень помог :)
очень рад за вас, что для выполнения работы у вас всегда столько времени сколько нужно.
19 сен 12, 10:27    [13186724]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Dzianis, отмазка,
задать вопрос на SQL.RU и ждать ответа занимает намного больше времени.
А если вы надеетесь что обязаны ответить быстро, то
1. Наивно
2. Нагло (не взваливайте на других свою работу)

Искать готовый ответ честнее.
19 сен 12, 11:11    [13187157]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Dzianis
Member

Откуда:
Сообщений: 76
Да. беспощадный русский форум.
Не важно какой был вопрос, всегда найдется человек точно знающий чем ты занимаешься, уровень образования, дохода, породу кота и почему ты не прав. И научит правильно жить :)

Вопрос был достаточно простой, есть скрипт или нет. Можно или поделиться если он есть, или не поделиться, если не хочется.
Отмазка, это писать "да писал, но скрипт не рядом и банально лень ..."
19 сен 12, 11:28    [13187354]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Да, беспощадные русские абыватели, им покажут что к чему и уму разуму и куда копать и как действовать и на что обратить внимание, так нет, ни спасиба, ни терпения, ни уважения, да ещё взамен шиш с мазлом и сверху матом.
Предложение определяется спросом (и наоборот).
А про уровень дохода нам должно быть пофигу, как настоящему буржую, а образование это ваши проблемы. Не могёте - гуляйте.

+ FK Script generator
Вот, кое что выкусил
SELECT	(
SELECT	 CASE	WHEN Row_Number()OVER(PARTITION BY K.constraint_object_id, K.[type] ORDER BY K.constraint_column_id ASC ) = 1 AND K.[type] = 0
		THEN 'ALTER TABLE ' + QuoteName(Object_Schema_Name(F.parent_object_id)) + '.' + QuoteName(Object_Name(F.parent_object_id)) + ' ADD CONSTRAINT ' + QuoteName(F.[name]) + ' FOREIGN KEY ('
		WHEN Row_Number()OVER(PARTITION BY K.constraint_object_id, K.[type] ORDER BY K.constraint_column_id ASC ) = 1 AND K.[type] = 1
		THEN ') REFERENCES '+ QuoteName(Schema_Name(ObjectProperty(F.referenced_object_id,'SchemaId'))) + '.' + QuoteName(Object_Name(F.referenced_object_id)) + ' ('
		ELSE ','
		END
	,QuoteName(C.[name])
	,CASE	WHEN Row_Number()OVER(PARTITION BY K.constraint_object_id, K.[type] ORDER BY K.constraint_column_id DESC) = 1 AND K.[type] = 1
		THEN ')'+ CASE WHEN F.delete_referential_action != 0 THEN ' ON DELETE ' + Replace(F.delete_referential_action_desc,'_',' ') ELSE '' END
			+ CASE WHEN F.update_referential_action != 0 THEN ' ON UPDATE ' + Replace(F.update_referential_action_desc,'_',' ') ELSE '' END + '
'		END
FROM	     sys.foreign_keys	F
	JOIN (	SELECT	 constraint_object_id
			,constraint_column_id
			,0			AS [type]
			,parent_object_id	AS [object_id]
			,parent_column_id	AS column_id
		FROM	sys.foreign_key_columns
	UNION	ALL
		SELECT	 constraint_object_id
			,constraint_column_id
			,1			AS [type]
			,referenced_object_id	AS [object_id]
			,referenced_column_id	AS column_id
		FROM	sys.foreign_key_columns
			)	K ON K.constraint_object_id	= F.[object_id]
	JOIN sys.columns	C ON C.[object_id]		= K.[object_id]
				 AND C.column_id		= K.column_id
ORDER BY Object_Schema_Name(F.parent_object_id)
	,Object_Name(F.parent_object_id)
	,K.constraint_object_id
	,K.[type]
	,K.constraint_column_id
FOR XML Path(''),Type)
Далее сами допиливайте (ставьте условия, дописывайте Action, и DROP в начале).
19 сен 12, 15:33    [13189951]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Dzianis
Member

Откуда:
Сообщений: 76
вчера. когда обратился за скриптом как то отклика не было. С задачей справился самостоятельно как смог.
С удовольствием сказал бы спасибо, если бы заготовка скрипта была вчера. Но рассуждения "программист, не программист, нужно каскадное удаление, не нужно, лень, не лень" при конкретном вопросе это была пустая трата времени, как своего так и чужого.
19 сен 12, 17:13    [13191012]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на включение каскадного удаления по всей базе данных  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А я тебе о чём и толкую - изначально было бесполезно.
И вот так каждый шишки должен набить чтобы понять эту очевидную вещь.

Или ты думаешь, что вчера кто-то (включая меня) мог выложить?
Да, у нас - совков, всегда нереальные ожидания реальности.

Одни надеются на адекватность, а другим подавай всё бесплатно, сразу же, быстра, *ах.

Не, тупые варвары, мы все. Генетика.
19 сен 12, 18:48    [13191477]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить