Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как получить текст триггера длинной кода > 4000сим 
V
    Опции темы
semi
Дата 11.8.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 10.12.2006
Где: ой, все сложно...

Репутация: нет
Всего: нет



Здравствуйте!
Есть бд большим количеством таблиц, в каждой из них есть триггер на 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

Это сообщение отредактировал(а) semi - 11.8.2011, 23:18
PM MAIL ICQ   Вверх
Akina
Дата 11.8.2011, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
semi
Дата 11.8.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 10.12.2006
Где: ой, все сложно...

Репутация: нет
Всего: нет



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

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

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


программно получить код всех триггеров никак нельзя?
PM MAIL ICQ   Вверх
semi
Дата 12.8.2011, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 10.12.2006
Где: ой, все сложно...

Репутация: нет
Всего: нет



в итоге вот такое решение:
Код

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

не знаю насколько оно оптимально, но задачу выполняет.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0800 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.