Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Нужно изменить триггер только в том случае когда он уже существует.

IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
begin
ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE
AS
begin
........
........
end
end
GO

При запусе SQL выдаёт кучу сообщений об ошибках. Без IF всё прекрасно работает.

ЧЕГО ТУТ НЕ ТАК????
28 ноя 18, 11:27    [21747007]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
burgos,

наверное потму что
автор
CREATE TRIGGER must be the first statement in the batch and can apply to only one table.
28 ноя 18, 11:32    [21747017]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
TaPaK,

Похоже, что так... Спасибо. Придётся изощеряться.
28 ноя 18, 11:39    [21747031]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

в 2016 SP1 сервере появилось CREATE OR ALTER.

Копите деньги на апгрейд...
28 ноя 18, 12:14    [21747124]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов,

Я передам это шефу. :)
28 ноя 18, 12:26    [21747156]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов
burgos,

в 2016 SP1 сервере появилось CREATE OR ALTER.

Копите деньги на апгрейд...


Мне не нужно CREATE OR ALTER. Мне нужно только ALTER. Этот триггер не должен быть создан там где его нет, он должен быть изменен в том случае, если он уже существует.

P.S. 2106 это уже пройденый этап. У нас 2017. :)
28 ноя 18, 12:34    [21747171]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

запишите так:

BEGIN TRAN
GO

IF ... IS NOT NULL
 DROP OBJ
GO

CREATE OBJ
GO

COMMIT
28 ноя 18, 12:34    [21747172]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

IF ... IS NULL
  RETURN
GO
ALTER ...
GO
28 ноя 18, 12:36    [21747177]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
Или переход по метке, если общий скрипт.
28 ноя 18, 12:37    [21747181]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов,

CREATE не нужен. Только ALTER.
21747171
28 ноя 18, 12:38    [21747183]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов
Или переход по метке, если общий скрипт.


Это попробую!!!
28 ноя 18, 12:39    [21747189]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
Владислав Колосов
burgos,

IF ... IS NULL
  RETURN
GO
ALTER ...
GO

занятно и будет работать? :)
28 ноя 18, 12:40    [21747191]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
256k
Member

Откуда: с.Торчилово, Псковская обл.
Сообщений: 352
TaPaK
Владислав Колосов
burgos,

IF ... IS NULL
  RETURN
GO
ALTER ...
GO

занятно и будет работать? :)


ретурн загадочен, чтобы не сомневались в существовании бесконечности
28 ноя 18, 12:41    [21747195]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

за пределами пакета не сработает, сразу не подумал :)
28 ноя 18, 12:41    [21747197]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
TaPaK
Владислав Колосов
burgos,

IF ... IS NULL
  RETURN
GO
ALTER ...
GO

занятно и будет работать? :)


Это SQL изменений и дальше есть код.
28 ноя 18, 12:48    [21747212]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
Владислав Колосов,

переход по метке это тоже мимо.

Вариант или в транзакции DROP-CREATE Откат если не надо было или в динамику оборачивать ALTER
28 ноя 18, 12:49    [21747213]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 46482
Решение в лоб - написать в динамике ALTER TRIGGER, а EXECUTE(N'<Текст ALTER TRIGGER>') выполнять
после проверки существования с созданием триггера, если его нет.
IF OBJECT_ID(N'Имя_Триггера', 'TR') IS NULL
EXECUTE(N'CREATE TRIGGER [Имя_Триггера] FOR UPDATE ON [Имя_Таблицы] AS;');
EXECUTE(N'ALTER TRIGGER [Имя_Триггера] FOR UPDATE ON [Имя_Таблицы] AS <Текст триггера>');
Недостаток очевиден: если текст триггера большой, содержит одиночные кавычки и другие динамические EXECи,
то текст внутри EXECUTE('') получается нечитаемым и трудно поддерживаемым.
28 ноя 18, 13:01    [21747232]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

Работает. :)
28 ноя 18, 13:03    [21747235]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 46482
burgos
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

Работает. :)
Если можно с GO, то и динамика не нужна

Кстати, я там выше перепутал порядок ON TableName и FOR UPDATE
Извините
28 ноя 18, 13:14    [21747253]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
iap
Member

Откуда: Москва
Сообщений: 46482
iap
burgos
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

Работает. :)
Если можно с GO, то и динамика не нужна

Кстати, я там выше перепутал порядок ON TableName и FOR UPDATE Картинка с другого сайта.
Извините
Кстати, тогда помогут и SET NOEXEC {ON|OFF}
28 ноя 18, 13:16    [21747255]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
burgos
Придётся изощеряться. Картинка с другого сайта.

2 варанта
1.
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NULL
    SET NOEXEC ON 
GO
ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE
AS 
begin
........
........
end
GO
SET NOEXEC OFF
GO

2.
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
    EXEC('
ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE
AS 
begin
........
........
end

')
GO


В вариента 2 не забывайте удваивать кавычки в теле триггера
28 ноя 18, 13:24    [21747270]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
alexeyvg,

2-й! Уже сделал. :)
28 ноя 18, 13:26    [21747275]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Спасибо всем!
:)
28 ноя 18, 14:07    [21747376]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2368
burgos,

а просто запустить алтер и проигнорировать ошибку если его небыло?
28 ноя 18, 17:27    [21747685]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
WarAnt
burgos,

а просто запустить алтер и проигнорировать ошибку если его небыло?


Это запускаю не я, а техники при актуализации приложения. Люди они нежные, при любом сообщении об ошибке впадающие а депрессию, из которой их вывести практически невозможно.
28 ноя 18, 18:10    [21747751]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
burgos
WarAnt
burgos,

а просто запустить алтер и проигнорировать ошибку если его небыло?


Это запускаю не я, а техники при актуализации приложения. Люди они нежные, при любом сообщении об ошибке впадающие а депрессию, из которой их вывести практически невозможно. Картинка с другого сайта.
Беречь техников, конечно, правильно, но вообще у вас странная концепция обновлений.
Вы же должны привести базу в требуемое вам состояние. То есть если триггер должен быть, вы его создаёте/меняете, если не должен, то его и в коде обновления не будет.
Код (проект) должен быть эталогом, должны быть пакеты обновлений, приводящие БД в требуемую версию, далее вы (или техники) накатываете пакеты на нужные системы (дев, тест, продакшен1, ... продакшенN), приводя системы в нужное состояние.

А у вас сейчас, видимо, базы (причём несколько разных), в которых ручками что то правили (а где то не правили), и вам это не надо трогать.
Подход рискованный, вы не будете знать, в каком состоянии база, какой в ней код, вы её не контролируете. Процесс сопровождения становится нервным, с бесконечными разборками "кто виноват".
28 ноя 18, 18:38    [21747787]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
alexeyvg,

У нас несколько другая ситуация. Иммется некий набор программ связанных мёду собой, и состоящих из отдельных блоков, которые подключаются в зависимости от того какую конфигурацию купит клиент. Существует также некий набор баз данных, которые тоже устанавливаются в зависимости от конфигурации. Плюс зти программы в некоторых случаях связаны с базами данных других программ, из которых они качают или в которые они передают данные. В общем черт голову сломить. Технику надо прийти к клиенту, запустить блок актуализации структур баз данных, установить новую версию программы и всё это не особенно зная, что именно там установлено. Каша конечно полная, но работает.
28 ноя 18, 22:55    [21747933]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

тому, что Вы описали - прямая дорога в систему версионирования.
Каждому заказчику поставляется та версия и те изменения в этой версии продукта с которой он желает работать.
Для этого есть GIT, SVN и тому подобное.
29 ноя 18, 13:18    [21748475]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
L_argo
Member

Откуда:
Сообщений: 444
TaPaK
burgos,

наверное потму что
CREATE TRIGGER must be the first statement in the batch and can apply to only one table.
причем это касается всех CREATE (ХП,/Ф-ций/Таблиц).

Аццки неудобно писать скрипты, которые должны накатываться на непустую БД.
При этом Drop+Create не выход, т.к. Create может быть неуспешен, ну и настроенные гранты слетят нафиг.
Приходится извращаться с exec('create ...'). :(

MS - дебилы на всю голову.
29 ноя 18, 14:38    [21748634]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35831
L_argo
TaPaK
burgos,

наверное потму что
пропущено...
причем это касается всех CREATE (ХП,/Ф-ций/Таблиц).

Аццки неудобно писать скрипты, которые должны накатываться на непустую БД.
При этом Drop+Create не выход, т.к. Create может быть неуспешен, ну и настроенные гранты слетят нафиг.
Приходится извращаться с exec('create ...'). :(

MS - дебилы на всю голову.
"Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.
29 ноя 18, 14:42    [21748639]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов
burgos,

тому, что Вы описали - прямая дорога в систему версионирования.
Каждому заказчику поставляется та версия и те изменения в этой версии продукта с которой он желает работать.
Для этого есть GIT, SVN и тому подобное.


Основываясь на моём скомном опыте поддержка нескольких версий програмы нежизнеспособна. Гораздо проще установить всем одну и ту же версию програмы и задать ей конкретный режим функционирования с помощью файла, в которам задана конфигурация.
29 ноя 18, 15:34    [21748748]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
L_argo
Member

Откуда:
Сообщений: 444
Гавриленко Сергей Алексеевич
"Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.
И толку с того ССДТ ???
Я сам программно создаю такие, как надо скрипты, а потом их накатываю. ССДТ все равно таких никогда не создаст.
К тому же в реальных условиях может не быть под рукой ССДТ, н-р у заказчика.

На create or alter сподобились аж в 2016. Не прошло и 20 лет.
29 ноя 18, 15:47    [21748774]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
burgos
alexeyvg,

У нас несколько другая ситуация. Иммется некий набор программ связанных мёду собой, и состоящих из отдельных блоков, которые подключаются в зависимости от того какую конфигурацию купит клиент. Существует также некий набор баз данных, которые тоже устанавливаются в зависимости от конфигурации. Плюс зти программы в некоторых случаях связаны с базами данных других программ, из которых они качают или в которые они передают данные. В общем черт голову сломить. Технику надо прийти к клиенту, запустить блок актуализации структур баз данных, установить новую версию программы и всё это не особенно зная, что именно там установлено. Каша конечно полная, но работает.
Никакого противоречия с тем, что я написал.
Я же писал "(дев, тест, продакшен1, ... продакшенN)" - вот разные продакшен - это и есть разные клиенты, разные рабочие базы, которые должны немного отличаться друг от друга.

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

То есть вместо
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
    EXEC('
ALTER TRIGGER Имя_Триггера ON Таблица

Писать
IF @SERVERNAME = 'имя сервера клиента'
    EXEC('
CREATE OR ALTER TRIGGER Имя_Триггера ON Таблица


Хотя инсталлятор для конкретного клиента ИМХО лучше.
L_argo
Аццки неудобно писать скрипты, которые должны накатываться на непустую БД.
ИМХО вопрос привычки к языку.
"Аццки неудобно" - это когда нужно затратить для чего-либо в разы больше труда, чем можно было бы.
А тут вопрос всего лишь в навыке, окружении и инструментах. Эти окружение и инструменты формируются в команде, и, в общем, всё стьановится легко и ненапряжно.

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

L_argo
При этом Drop+Create не выход, т.к. Create может быть неуспешен, ну и настроенные гранты слетят нафиг.
Это я не понял.
Права надо прописывать в скрипте.
А если "Create неуспешен", то, значит, апдэйт не удался, нужно читать ошибку и исправлять (или воосстановить из бакапа, и отослать разработчикам письмо с логом).
Гавриленко Сергей Алексеевич
"Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.
ИМХО для задачи ТС не будет разницы между SSDT и нотепадом, писать то скрипты всё равно вручную
29 ноя 18, 15:55    [21748789]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
L_argo
На create or alter сподобились аж в 2016. Не прошло и 20 лет.
С одной стороны да, эито минус МС
С другой стороны, это разве что то меняет?
По любому апдэйт кода делается тулзом разработки, либо в виде исходного шаблока для кода процедуры, либо сборщиком - не набираете же вы код процедуры/триггера в скрипте полностью второй раз?
А потом скрипт должен собираться сборщиком апдэйта.
L_argo
И толку с того ССДТ ???
Я сам программно создаю такие, как надо скрипты, а потом их накатываю. ССДТ все равно таких никогда не создаст.
К тому же в реальных условиях может не быть под рукой ССДТ, н-р у заказчика.
Да, для работы со сложными проектами БД МС так ничего и не создал с 80-х
Всё тот же make, ну, или свои самодельные программы.
29 ноя 18, 16:00    [21748796]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
L_argo
Member

Откуда:
Сообщений: 444
Права надо прописывать в скрипте.
Это не всегда возможно. А что если каждый логин имеет индивидуальную схему Grant-прав (пусть не на все объекты, а на некоторые критичные) ? Я такое встречал.
Перенакат прав - штука небыстрая и нетривиальная, т.к. список дропнутых/пересозданных объектов неочевиден и не всем из них нужен перенакат.
У нас полный перенакат всех прав занимал ок. 1мин. с почти полной блокировкой работы. :(
Зачем проделывать это всё, если достаточно всего лишь ALTER ?
29 ноя 18, 16:21    [21748838]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
L_argo
Это не всегда возможно.
Ну в принципе да, хотя индивидуальные права по логинам всё таки сильное исключение
L_argo
Зачем проделывать это всё, если достаточно всего лишь ALTER ?
Ну это так, зачемание по правам, а вообще ничего не мешает делать только ALTER
У на стандартный шаблон процедуры (триггера) в студии
IF OBJECT_ID ('Имя') IS NULL
    EXEC('CREATE ...') -- тут создаём пустой объект
GO
ALTER ...
........
........
GO

Соответственно всегда делается просто ALTER
L_argo
Перенакат прав - штука небыстрая и нетривиальная, т.к. список дропнутых/пересозданных объектов неочевиден и не всем из них нужен перенакат.
У нас полный перенакат всех прав занимал ок. 1мин. с почти полной блокировкой работы. :(
Это уже зависит от концепции прав
Если есть некие роли, предназначенные разным группам процедур, то раздача прав делается в скрипте создания самого объекта. И тогда не надо перезаливать все права.
Зачем "все", если мы меняем в апдэйте немногие объекты? Вот для них, которые меняли, и надо назначать права, а не перезаливать всё.
29 ноя 18, 16:46    [21748874]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
L_argo
Member

Откуда:
Сообщений: 444
У наc стандартный шаблон процедуры (триггера) в студии
У меня точно также.
Но хак с EXEC('create ...') конеш это ненормально в 21 веке (кинул камень в сторону MS).

А перезаливка прав - штука специфичная и динамичная для каждого проекта и не хотелось бы массово выносить ее в скрипты.
29 ноя 18, 17:56    [21748937]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
L_argo
У наc стандартный шаблон процедуры (триггера) в студии
У меня точно также.
Но хак с EXEC('create ...') конеш это ненормально в 21 веке (кинул камень в сторону MS).

А перезаливка прав - штука специфичная и динамичная для каждого проекта и не хотелось бы массово выносить ее в скрипты.

Всё, что работает, нормально. Впрочем, предложите альтернативы.
29 ноя 18, 18:01    [21748945]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5968
burgos,

Альтернатива - это SSDT и умение работать с ветками GIT. Плюс немного персонала, занимающегося по совместительству формированием поставок. Персонал можно ротировать, чтобы все в курсе были.
30 ноя 18, 11:11    [21749638]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER  [new]
burgos
Member

Откуда: España
Сообщений: 9093
Владислав Колосов,

У нас фирма 26 человек, включая 2 техника, одного comercial, который надоедает потенциальным клиентам и выслушивает претензии не потенциальных, начальника, бухгалтера и 2-х на тестконтроле. Остальные, как принято выражаться, говнокодеры/руководители проектов, часто в одном лице. Можно конечно устроить им ротацию, но не знаю насколько это нужно. :)
30 ноя 18, 12:54    [21749831]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить