Один метод, который вызывает метод во многих других базах данных с использованием курсора - зло или просто неприятный запах? - PullRequest
0 голосов
/ 28 октября 2009

Я делаю обзор кода с клиентом. Это процесс на SQL Server 2008. Он хочет делать все на SQL, а не процесс. Он просматривает список каталогов, а затем запускает процедуру в каждом из них:

DECLARE CatalogList CURSOR FOR 
SELECT 'EXEC ' + c.CatalogName+ '.dbo.procInEachDb '
FROM CatalogList

FETCH NEXT FROM CatalogList INTO @SQL
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC( @SQL)
    --PRINT @SQL
    FETCH NEXT FROM CatalogList INTO @SQL
END

Я указал, что тупик в одном дБ убьет весь процесс. Он считает, что это код, который запускается каждые пять минут, и он будет запущен в следующий раз.

Этот код плохо пахнет, но я не могу назвать конкретные причины. Я ошибаюсь, что это проблема?

1 Ответ

0 голосов
/ 29 октября 2009

Это действительно зависит от того, что делает procInEachDb. Я могу понять пример использования, когда у вас есть один и тот же код в каждой базе данных, который нужно выполнять независимо, потому что он опирается на объекты локальной области, манипулирует данными, переносит данные в другие места и т. Д. В нескольких базах данных можно сделать не так много из одной операции, особенно если набор баз данных является динамическим (возможно, со статическим набором, вы можете записывать UNION для разных баз данных и т. д., но вы все равно не можете писать). Но я бы действительно постарался понять от клиента, что делает процедура и почему она так нарушена. Вполне возможно, что это лучший способ сделать то, что нужно клиенту, и в этом случае нет никакого неприятного запаха, за исключением того, что, возможно, он мог бы использовать лучшую обработку ошибок. =) * * Тысяча одна

Я управляю одной системой, в которой у нас есть более 500 примерно одинаковых баз данных в экземпляре, и нам нужно запускать один и тот же набор регулярно запланированных задач в каждой. Я не хочу создавать 500 заданий агента и не хочу создавать задание с 500 шагами, поэтому вместо этого я создал хранимую процедуру с некоторыми настройками, которая ведет себя как sp_MSForEachDB (которая по сути совпадает с кодом, который вы показываете). выше). Я повторно использую эту же процедуру для многих команд, которые я хочу выполнить для всех баз данных. Процедура также принимает аргументы, которые допускают исключения и т. Д.

Да, я мог бы сделать нечто подобное с сервисным брокером, но я обнаружил, что для некоторых вещей мне нужно больше наглядности и контроля над тем, что на самом деле происходит. И, конечно, выполнять ручные одноразовые операции легко с помощью таких инструментов, как SQL Farms Combine или Red-Gate с несколькими сценариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...