powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / флаги отключения тригеров и ссылочных ограничений
9 сообщений из 9, страница 1 из 1
флаги отключения тригеров и ссылочных ограничений
    #32023427
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаю, вопрос не новый, но вот никак не найду на него ответа.
Необходимо обновить все данные в базе и для этого приходиться скриптовать, ронять и затем заново создавать - занятие более чем интелектуальное
Подскажите какие флаги надо использовать чтобы избежать вышеописанной процедуры.
Заранее благодарен,
Александр
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023430
Replicant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отключение триггеров: см синтакс ALTER TABLE , OBJECTPROPERTY
\nALTER TABLE table
...
...| {ENABLE | DISABLE} TRIGGER
{ALL | trigger_name[,...n]}


Отключение ограничений: см синтакс ALTER TABLE , DROP INDEX, CREATE INDEX
\nALTER TABLE table
...
| DROP
{ [CONSTRAINT] constraint_name
| COLUMN column


Удачи
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023434
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-во, именно этого "геморроя" и хочется избежать - в базе более 7000 (!) таблиц, половина из которых жестко ссылается друг на друга (некоторые аж в три этажа).
Ведь должно же это как-то отключаться проще.

Александр
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023438
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ух ты... 7000 таблиц. Можно узнать откуда такая база? Насколько я знаю, если в базе более 100 таблиц (view не в счет), то она становиться неуправляемой. Правда вопрос спорный.
И насчет ответа. Прийдется все-таки курсор делать, бегающий по всем таблицам.
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023441
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все триггера можно отключить командой
sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
, а включить
sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023442
Alexander_Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я знаю, если в базе более 100 таблиц (view не в счет), то она становиться неуправляемой
----------------------------
SergCat: Это Вы SAP'у расскажите - у них в R/3 больше 11000 таблиц
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023445
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну погорячился. Прошу прощения.
IMHO по наличию большого количества таблиц не стоит судить о "крутости" базы.
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023484
DAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Предлагаю воспользоваться процедурами ВКЛЮЧЕНИЯ/ОТКЛЮЧЕНИЯ триггеров, внешних ключей
--и ограничений на значения. Если есть вопросы - dalw@cis-kiev.com

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_DisEnCc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SP_DisEnCc]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_DisEnFk]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SP_DisEnFk]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_DisEnTr]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[SP_DisEnTr]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO





CREATE PROCEDURE SP_DisEnCc
-- Запрещение, разрешение и показ ограничения(ий) на значение(я).
@TypOp char(1)='H', -- ТИП ДЕЙСТВИЯ:
-- 'D' - запрещение (disable)
-- 'E' - разрешение (enable)
-- не 'DE' - показ (select)
@NamCc sysname=NULL -- Имя ограничения; */NULL - все
AS set nocount on -- Ошибки: 1 - неверный параметр
if @TypOp is NULL select @TypOp='H' -- 2 - несуществующий об'ект
select @NamCc=ltrim(rtrim(@NamCc)) -- 3 - нет данных
if isnull(@NamCc,'*') = '*' select @NamCc=NULL -- 4 - операция не выполнена
declare @TabName sysname, @CcName sysname, @St int, @Xx smallint
if @TypOp not in ('D','E') begin
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ПОКАЗ > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
select a.name [CheckConstraint],isnull(dbo.f_SubObjDesc(b.name,'table',a.name,
'constraint'),dbo.ff_CCDesc(a.name)) [Description],
case when ObjectProperty(a.id,'CnstIsDisabled') = 0 then 'Enabled'
else 'Disabled' end [Status]
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'C' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamCc,a.name) order by b.name
return 0 end
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ЗАПРЕЩЕНИЕ/РАЗРЕШЕНИЕ > @@@@@@@@@@@@@@@@@
declare cur_Sel__Cc_DE cursor local for select a.name,b.name,
ObjectProperty(a.id,'CnstIsDisabled')
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'C' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamCc,a.name)
if @@ERROR != 0 return 4
open cur_Sel__Cc_DE
if @@ERROR != 0 return 4
fetch next from cur_Sel__Cc_DE into @CcName,@TabName,@St
if @@ERROR != 0 return 4
while @@FETCH_STATUS != -1 begin if @@FETCH_STATUS != -2 begin
if @TypOp = 'D' begin -- Запрет
if @St = 0 exec('alter table '+@TabName+' nocheck constraint '+@CcName) end
else if @St = 1 exec('alter table '+@TabName+' check constraint '+@CcName) end
if @@ERROR != 0 return 4
fetch next from cur_Sel__Cc_DE into @CcName,@TabName,@St
if @@ERROR != 0 return 4 end
close cur_Sel__Cc_DE deallocate cur_Sel__Cc_DE
return 0
-- ============================================================================
return 0
-- #### (c) "PolySystem" 11.02.02 ##########################################






GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




CREATE PROCEDURE SP_DisEnFk
-- Запрещение, разрешение и показ состояния внешнего(их) ключа(ей).
@TypOp char(1)='H', -- ТИП ДЕЙСТВИЯ:
-- 'D' - запрещение (disable)
-- 'E' - разрешение (enable)
-- не 'DE' - показ (select)
@NamFk sysname=NULL -- Имя ключа; */NULL - все
AS set nocount on -- Ошибки: 1 - неверный параметр
if @TypOp is NULL select @TypOp='H' -- 2 - несуществующий об'ект
select @NamFk=ltrim(rtrim(@NamFk)) -- 3 - нет данных
if isnull(@NamFk,'*') = '*' select @NamFk=NULL -- 4 - операция не выполнена
declare @TabName sysname, @FkName sysname, @St int, @TypCn char(1)
if @TypOp not in ('D','E') begin
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ПОКАЗ > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
select a.name [ForeignKey],isnull(dbo.f_SubObjDesc(b.name,'table',a.name,
'constraint'),dbo.ff_FkDesc(a.name)) [Description],
case when ObjectProperty(a.id,'CnstIsDisabled') = 0 then 'Enabled'
else 'Disabled' end [Status]
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'F' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamFk,a.name) order by b.name
return 0 end
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ЗАПРЕЩЕНИЕ/РАЗРЕШЕНИЕ > @@@@@@@@@@@@@@@@@
declare cur_Sel__Fk_DE cursor local for
select a.name,b.name,ObjectProperty(a.id,'CnstIsDisabled')
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'F' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamFk,a.name)
if @@ERROR != 0 return 4
open cur_Sel__Fk_DE
if @@ERROR != 0 return 4
fetch next from cur_Sel__Fk_DE into @FkName,@TabName,@St
if @@ERROR != 0 return 4
while @@FETCH_STATUS != -1 begin if @@FETCH_STATUS != -2 begin
if @TypOp = 'D' begin -- Запрет
if @St = 0 exec('alter table '+@TabName+' nocheck constraint '+@FkName) end
else if @St = 1 exec('alter table '+@TabName+' check constraint '+@FkName) end
if @@ERROR != 0 return 4
fetch next from cur_Sel__Fk_DE into @FkName,@TabName,@St
if @@ERROR != 0 return 4 end
close cur_Sel__Fk_DE deallocate cur_Sel__Fk_DE
return 0
-- ============================================================================
return 0
-- #### (c) "PolySystem" 11.02.02 ##########################################





GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




CREATE PROCEDURE SP_DisEnTr
-- Запрещение, разрешение и показ состояния триггера(ов).
@TypOp char(1)='H', -- ТИП ДЕЙСТВИЯ:
-- 'D' - запрещение (disable)
-- 'E' - разрешение (enable)
-- не 'DE' - показ (select)
@NamTr sysname=NULL -- Имя триггера; */NULL - все
AS set nocount on -- Ошибки: 1 - неверный параметр
if @TypOp is NULL select @TypOp='H' -- 2 - несуществующий об'ект
select @NamTR=ltrim(rtrim(@NamTr)) -- 3 - нет данных
if isnull(@NamTr,'*') = '*' select @NamTr=NULL -- 4 - операция не выполнена
declare @TabName sysname, @TrName sysname, @St int
if @TypOp not in ('D','E') begin
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ПОКАЗ > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
select a.name [Trigger],isnull(dbo.f_SubObjDesc(b.name,'table',a.name,
'trigger'),'') [Description],case when ObjectProperty(a.id,
'ExecIsTriggerDisabled') = 0 then 'Enabled' else 'Disabled' end [Status]
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'TR' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamTr,a.name) order by b.name
return 0 end
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@ < ЗАПРЕЩЕНИЕ/РАЗРЕШЕНИЕ > @@@@@@@@@@@@@@@@@
declare cur_Sel__Tr_DE cursor local for select a.name,b.name,
ObjectProperty(a.id,'ExecIsTriggerDisabled')
from sysobjects a, sysobjects b where a.parent_obj = b.id
and a.xtype = 'TR' and b.xtype = 'U' and b.status >= 0
and a.name = isnull(@NamTr,a.name)
if @@ERROR != 0 return 4
open cur_Sel__Tr_DE
if @@ERROR != 0 return 4
fetch next from cur_Sel__Tr_DE into @TrName,@TabName,@St
if @@ERROR != 0 return 4
while @@FETCH_STATUS != -1 begin if @@FETCH_STATUS != -2 begin
if @TypOp = 'D' begin -- Запрет
if @St = 0 exec('alter table '+@TabName+' disable trigger '+ @TrName) end
else if @St = 1 exec('alter table '+@TabName+' enable trigger '+ @TrName) end
if @@ERROR != 0 return 4
fetch next from cur_Sel__Tr_DE into @TrName,@TabName,@St
if @@ERROR != 0 return 4 end
close cur_Sel__Tr_DE deallocate cur_Sel__Tr_DE
-- ============================================================================
return 0
-- #### (c) "PolySystem" 08.02.02 ##########################################





GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
...
Рейтинг: 0 / 0
флаги отключения тригеров и ссылочных ограничений
    #32023494
Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо за помощь. Попробую код - выглядит он на первый взгляд совсем неплохо.
База совсем не крутая, скорее это неповоротливый тупой монстр, доставшийся мне по наследству. Время отклика такое (за счет бесчисленных проверок внутри базы) что рабочий день пользователя умещается в "десять кликов"
Вот и приходится латать ее малыми порциями, что делает ее еще более тупым нагромождением....
Кстати у начальства есть планы заменить все это SAP R/3. Уж и не знаю, что лучше.


С уважением,

Александр
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / флаги отключения тригеров и ссылочных ограничений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]