ОТБРАСЫВАНИЕ … СОЗДАЕТ по сравнению с, ИЗМЕНЯЮТСЯ

public static string DecodeQuotedPrintables(string input, Encoding encoding)
    {
        var regex = new Regex(@"\=(?<Symbol>[0-9A-Z]{2})", RegexOptions.Multiline);
        var matches = regex.Matches(input);
        var bytes = new byte[matches.Count];

        for (var i = 0; i < matches.Count; i++)
        {
            bytes[i] = Convert.ToByte(matches[i].Groups["Symbol"].Value, 16);
        }

        return encoding.GetString(bytes);
    }
57
задан OMG Ponies 29 October 2009 в 16:39
поделиться

8 ответов

ALTER также принудительно перекомпилирует всю процедуру. Перекомпиляция на уровне операторов применяется к операторам внутри процедур, например. один SELECT, который перекомпилируется из-за изменения базовых таблиц без каких-либо изменений в процедуре. Невозможно даже выборочно перекомпилировать только определенные операторы процедуры ALTER, чтобы понять , что изменилось в тексте SQL после процедуры ALTER, сервер должен был бы ... скомпилировать его.

] Для всех объектов ALTER всегда лучше, потому что он сохраняет всю безопасность, все расширенные свойства, все зависимости и все ограничения.

53
ответ дан 24 November 2019 в 19:30
поделиться

Вот как мы это делаем:

if object_id('YourSP') is null
    exec ('create procedure dbo.YourSP as select 1')
go
alter procedure dbo.YourSP
as
...

Код создает "заглушку" хранимую процедуру, если она еще не существует, в противном случае он выполняет изменение. Таким образом, все существующие разрешения для процедуры сохраняются, даже если вы выполняете сценарий повторно.

53
ответ дан 24 November 2019 в 19:30
поделиться

Переделать вообще лучше. Если вы отбросите и создадите, вы можете потерять разрешения, связанные с этим объектом.

8
ответ дан 24 November 2019 в 19:30
поделиться

DROP обычно теряет разрешения И любые расширенные свойства.

В некоторых UDF ALTER также теряет расширенные свойства (определенно в SQL Server 2005 с несколькими операторами функции с табличными значениями).

Обычно я не DROP и CREATE , если я также не воссоздаю эти вещи (или не знаю, что хочу их потерять).

0
ответ дан 24 November 2019 в 19:30
поделиться

Если у вас есть функция / сохраненная процедура, которая, например, очень часто вызывается с веб-сайта, это может вызвать проблемы.

Сохраненная процедура будет удалена на несколько миллисекунд / секунд, и в течение этого времени все запросы не будут выполнены.

Если вы сделаете изменение, у вас не будет этой проблемы.

Шаблоны для вновь созданных сохраненных процедур обычно имеют такую ​​форму:

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = '<name>')
    BEGIN
        DROP PROCEDURE <name>
    END
GO

CREATE PROCEDURE <name>
......

Однако противоположное лучше, imo:

Если storedproc / function / etc не существует, создайте его с помощью фиктивного оператора select. Тогда изменение будет работать всегда - оно никогда не будет сброшено.

У нас есть хранимая процедура для этого, поэтому наши хранимые процедуры / функции обычно выглядят следующим образом:

EXEC Utils.pAssureExistance 'Schema.pStoredProc'
GO

ALTER PROCECURE Schema.pStoredProc
...

, и мы используем ту же сохраненную процедуру для функций:

EXEC Utils.pAssureExistance 'Schema.fFunction'
GO

ALTER FUNCTION Schema.fFunction
...

] В Utils.pAssureExistance мы выполняем IF и смотрим на первый символ после ".": Если это "f", мы создаем фиктивную функцию, если это "p", мы создаем фиктивную хранимую процедуру.

Однако будьте осторожны, если вы создаете фиктивную скалярную функцию, и ваше ALTER находится в функции с табличным значением, ALTER FUNCTION завершится ошибкой , говоря, что это несовместимо.

Опять же, Utils.pAssureExistance может быть удобен, с дополнительным необязательным параметром

EXEC Utils.pAssureExistance 'Schema.fFunction', 'TableValuedFunction'

создаст фиктивную функцию с табличным значением,

Дополнительно, я могу ошибаться, но я думаю, что если вы выполнить процедуру отбрасывания, и запрос в настоящее время использует хранимую процедуру, она завершится ошибкой.

Однако процедура изменения будет ждать, пока все запросы прекратят использование хранимой процедуры, а затем изменит ее. Если запросы «блокируют» сохраненную процедуру слишком долго (скажем, пару секунд), ALTER перестанет ждать блокировки и все равно изменит сохраненную процедуру:

1
ответ дан 24 November 2019 в 19:30
поделиться

Вы задали вопрос, конкретно относящийся к объектам БД, которые не содержат никаких данных, и теоретически не должны изменяться так часто.

Вероятно, вам может потребоваться редактировать эти объекты, но не каждые 5 минут. Из-за этого, я думаю, вы уже ударили молотком по голове - разрешения.

Краткий ответ, не проблема, если разрешения не являются проблемой

0
ответ дан 24 November 2019 в 19:30
поделиться

С точки зрения юзабилити лучше бросить и создать, чем переделать. Alter завершится ошибкой в ​​базе данных, которая не содержит этого объекта, но имеет IF EXISTS DROP, а затем CREATE будет работать в базе данных с уже существующим объектом или в базе данных, где объект не существует. В Oracle и PostgreSQL вы обычно создаете функции и процедуры с помощью оператора CREATE OR REPLACE, который выполняет то же самое, что и SQL SERVER IF EXISTS DROP, а затем CREATE. Было бы неплохо, если бы SQL Server взял на вооружение этот небольшой, но очень удобный синтаксис.

Я бы сделал это так. Поместите все это в один сценарий для данного объекта.

IF EXISTS ( SELECT 1
            FROM information_schema.routines
            WHERE routine_schema = 'dbo'
              AND routine_name   = '<PROCNAME'
              AND routine_type   = 'PROCEDURE' )
BEGIN
    DROP PROCEDURE <PROCNAME>
END
GO


CREATE PROCEDURE <PROCNAME>
AS
BEGIN
END
GO

GRANT EXECUTE ON <PROCNAME> TO <ROLE>
GO
-1
ответ дан 24 November 2019 в 19:30
поделиться

Раньше мы использовали alter, когда работали над разработкой, создавая новые функциональные возможности или изменяя их. Когда мы заканчивали разработку и тестирование, мы выполняли drop and create. Это изменяет отметку даты / времени на процессах, чтобы вы могли отсортировать их по дате / времени.

Это также позволило нам увидеть, что было объединено по дате для каждого отправленного нами результата.

0
ответ дан 24 November 2019 в 19:30
поделиться