Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > как получить текст триггера длинной кода > 4000сим


Автор: semi 11.8.2011, 20:28
Здравствуйте!
Есть бд большим количеством таблиц, в каждой из них есть триггер на update, вида "tU_%TableName%".
Нужно во всех триггерах заменить часть кода. Как это сделать, при условии, что код некоторых триггеров занимает больше 4000 символов?
На данный момент:
Код

declare @Trigger_name nvarchar(100)
declare @query nvarchar(max)

-- получаем список триггеров
declare c cursor for 
    select    
        name from sys.triggers
    where name like 'tU_%'
open c
fetch c into @Trigger_name

while @@fetch_status = 0
begin
    -- меняем нужный код
    SELECT @query = SELECT @query = replace(replace([text], 'create', 'alter'), 
            'код','другой код' )
    FROM syscomments
    WHERE [text] LIKE '%' + @Trigger_name + '%'
    
    if (len(@query) < 4000)
        -- иначе ругаеццо на "обрезанные" до 4000 символов запросы
    begin
        -- обновляем триггер с изменениями
        exec sp_Executesql @query
    end
  fetch c into @Trigger_name
end 

close c
deallocate c
GO


как обработать те, у которых длинна больше 4000?

или может знаете, как получить код всех триггеров, каждый в отдельном файле? (через tasks > generate scripts не получилось почему-то :( )
тогда замену можно было бы сделать не привязываясь к сиквелу, а затем просто выполнить измененные скрипты...

з.ы. mssql2008

Автор: Akina 11.8.2011, 20:49
Цитата(semi @  11.8.2011,  21:28 Найти цитируемый пост)
через tasks > generate scripts не получилось почему-то 

Наверное, что-то не прочитали в справке...

Автор: semi 11.8.2011, 20:58
Цитата(Akina @  11.8.2011,  20:49 Найти цитируемый пост)
Наверное, что-то не прочитали в справке... 

возможно вы подскажете что именно?
script triggers выставлен в true, все остальное в false, на следующей окне галка возле Tables и выбраны все таблицы. затем указана папка, и свойство "каждый скрипт в отдельный файл". Старт. Ошибок не выдает, файлов нет...

Добавлено через 8 минут и 45 секунд
а нет, вру. ошибка есть "OutOfMemory" :( всего 7 гигов база и такая неприятность....


программно получить код всех триггеров никак нельзя?

Автор: semi 12.8.2011, 01:04
в итоге вот такое решение:
Код

declare @Trigger_name nvarchar(100)
declare @query nvarchar(max)
-- получаем список триггеров
declare c cursor for 
    select    
        name from sys.triggers
    where name like 'tU_%'
open c
fetch c into @Trigger_name
while @@fetch_status = 0
begin
    SELECT @query = replace(replace(OBJECT_DEFINITION(OBJECT_ID(''+@Trigger_name+'')), 'create', 'alter'), 
            'код','замена' )
        
        -- обновляем триггер с изменениями
        -- print @Trigger_name
        -- print len(@query)
        exec sp_Executesql @query
    
  fetch c into @Trigger_name
end 
close c
deallocate c
GO

не знаю насколько оно оптимально, но задачу выполняет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)