Как я отбрасываю все ограничения внешнего ключа на таблицу в SQL-сервере 2000?

Согласно документации Python , sys модуль содержит функцию:

import sys
sys.getrefcount(object) #-- Returns the reference count of the object.

Обычно 1 выше, чем Вы мог бы ожидать, из-за объектной ссылки временного файла аргумента.

15
задан Mathias 17 September 2009 в 12:46
поделиться

3 ответа

Если просто отключить ограничения это вариант, вы можете использовать:

ALTER TABLE myTable NOCHECK CONSTRAINT all

, затем вы можете снова включить их, просто используя:

ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all

Если вы хотите отключить ограничения во всех таблицах, которые вы можете использовать:

-- disable all constraints
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- enable all constraints
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Подробнее в вопросе: Может ограничения внешнего ключа быть временно отключен с помощью TSQL?

Но если вам нужно отменить ограничения навсегда, вы можете использовать этот сценарий, размещенный на databasejurnal.com .

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

create proc sp_drop_fk_constraints
    @tablename  sysname
as
-- credit to: douglas bass

set nocount on

declare @constname  sysname,
    @cmd        varchar(1024)

declare curs_constraints cursor for
    select  name
    from    sysobjects 
    where   xtype in ('F')
    and (status & 64) = 0
    and     parent_obj = object_id(@tablename)

open curs_constraints

fetch next from curs_constraints into @constname
while (@@fetch_status = 0)
begin
    select @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @constname
    exec(@cmd)
    fetch next from curs_constraints into @constname
end

close curs_constraints
deallocate curs_constraints

return 0
15
ответ дан 1 December 2019 в 03:24
поделиться

Вот и все: (не тестировалось на SQL2000, но должно быть нормально)

Генерирует «отключает»:

SELECT  'IF EXISTS (SELECT * FROM sys.foreign_keys 
   WHERE object_id = OBJECT_ID(N''[dbo].' + FK +''') 
   AND parent_object_id = OBJECT_ID(N''[dbo].' + PT + ''')) 
   ALTER TABLE ' + PT + ' NOCHECK CONSTRAINT ' + FK + ';'
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK,
    OBJECT_NAME(parent_object_id) as PT
    FROM [sys].[foreign_key_columns] ) T
ORDER BY FK

Генерирует «включает»:

SELECT  'ALTER TABLE ' + PT + ' WITH CHECK CHECK CONSTRAINT ' + FK + ';'
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK,
    OBJECT_NAME(parent_object_id) as PT
    FROM [sys].[foreign_key_columns] ) T
ORDER BY FK

Обновление: Ой, я подумал вы хотели его для всех таблиц :) Вы можете просто изменить приведенное выше для своей единственной таблицы.

5
ответ дан 1 December 2019 в 03:24
поделиться

Я думаю, вы обнаружите, что нет простого способа сбросить ограничения для таблицы в SQL Server 2000. Тем не менее, есть много людей, которые написали сценарии, которые могут определить и удалить / отключить / воссоздать ограничения внешнего ключа. Один пример находится на http://www.mssqltips.com/tip.asp?tip=1376 , но я не тестировал его на SQL Server 2000.

РЕДАКТИРОВАТЬ: Вот еще один ] пример , который генерирует для вас сценарии удаления / создания.

2
ответ дан 1 December 2019 в 03:24
поделиться