powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ALTER TRIGGER
40 сообщений из 40, показаны все 2 страниц
ALTER TRIGGER
    #39739593
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно изменить триггер только в том случае когда он уже существует.

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

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

ЧЕГО ТУТ НЕ ТАК????
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739599
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

наверное потму что
авторCREATE TRIGGER must be the first statement in the batch and can apply to only one table.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739611
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Похоже, что так... Спасибо. Придётся изощеряться.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739650
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

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

Копите деньги на апгрейд...
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739664
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Я передам это шефу. :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739672
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовburgos,

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

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

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

P.S. 2106 это уже пройденый этап. У нас 2017. :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739673
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRAN
GO

IF ... IS NOT NULL
 DROP OBJ
GO

CREATE OBJ
GO

COMMIT
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739674
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

Код: sql
1.
2.
3.
4.
5.
IF ... IS NULL
  RETURN
GO
ALTER ...
GO
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739677
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или переход по метке, если общий скрипт.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739678
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

CREATE не нужен. Только ALTER.
21747171
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739681
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовИли переход по метке, если общий скрипт.

Это попробую!!!
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739682
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовburgos,

Код: sql
1.
2.
3.
4.
5.
IF ... IS NULL
  RETURN
GO
ALTER ...
GO


занятно и будет работать? :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739684
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKВладислав Колосовburgos,

Код: sql
1.
2.
3.
4.
5.
IF ... IS NULL
  RETURN
GO
ALTER ...
GO


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

ретурн загадочен, чтобы не сомневались в существовании бесконечности
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739685
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

за пределами пакета не сработает, сразу не подумал :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739694
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKВладислав Колосовburgos,

Код: sql
1.
2.
3.
4.
5.
IF ... IS NULL
  RETURN
GO
ALTER ...
GO


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

Это SQL изменений и дальше есть код.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739695
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

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

Вариант или в транзакции DROP-CREATE Откат если не надо было или в динамику оборачивать ALTER
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739702
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение в лоб - написать в динамике ALTER TRIGGER, а EXECUTE(N'<Текст ALTER TRIGGER>') выполнять
после проверки существования с созданием триггера, если его нет.
Код: sql
1.
2.
3.
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('') получается нечитаемым и трудно поддерживаемым.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739704
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

Работает. :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739712
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgosIF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

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

Кстати, я там выше перепутал порядок ON TableName и FOR UPDATE
Извините
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739714
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapburgosIF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
exec('ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE AS
......
......')
GO

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

Кстати, я там выше перепутал порядок ON TableName и FOR UPDATE

ИзвинитеКстати, тогда помогут и SET NOEXEC {ON|OFF}
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739726
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgosПридётся изощеряться.

2 варанта
1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NULL
    SET NOEXEC ON 
GO
ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE
AS 
begin
........
........
end
GO
SET NOEXEC OFF
GO


2.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IF OBJECT_ID ('Имя_Триггера', 'TR') IS NOT NULL
    EXEC('
ALTER TRIGGER Имя_Триггера ON Таблица
AFTER UPDATE
AS 
begin
........
........
end

')
GO



В вариента 2 не забывайте удваивать кавычки в теле триггера
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739730
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

2-й! Уже сделал. :)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739784
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем!
:)
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39739977
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

а просто запустить алтер и проигнорировать ошибку если его небыло?
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740013
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarAntburgos,

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

Это запускаю не я, а техники при актуализации приложения. Люди они нежные, при любом сообщении об ошибке впадающие а депрессию, из которой их вывести практически невозможно.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740039
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgosWarAntburgos,

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

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

А у вас сейчас, видимо, базы (причём несколько разных), в которых ручками что то правили (а где то не правили), и вам это не надо трогать.
Подход рискованный, вы не будете знать, в каком состоянии база, какой в ней код, вы её не контролируете. Процесс сопровождения становится нервным, с бесконечными разборками "кто виноват".
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740137
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

У нас несколько другая ситуация. Иммется некий набор программ связанных мёду собой, и состоящих из отдельных блоков, которые подключаются в зависимости от того какую конфигурацию купит клиент. Существует также некий набор баз данных, которые тоже устанавливаются в зависимости от конфигурации. Плюс зти программы в некоторых случаях связаны с базами данных других программ, из которых они качают или в которые они передают данные. В общем черт голову сломить. Технику надо прийти к клиенту, запустить блок актуализации структур баз данных, установить новую версию программы и всё это не особенно зная, что именно там установлено. Каша конечно полная, но работает.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740334
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

тому, что Вы описали - прямая дорога в систему версионирования.
Каждому заказчику поставляется та версия и те изменения в этой версии продукта с которой он желает работать.
Для этого есть GIT, SVN и тому подобное.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740382
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKburgos,

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

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

MS - дебилы на всю голову.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740383
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoTaPaKburgos,

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

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

MS - дебилы на всю голову."Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740417
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовburgos,

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

Основываясь на моём скомном опыте поддержка нескольких версий програмы нежизнеспособна. Гораздо проще установить всем одну и ту же версию програмы и задать ей конкретный режим функционирования с помощью файла, в которам задана конфигурация.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740426
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич"Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.И толку с того ССДТ ???
Я сам программно создаю такие, как надо скрипты, а потом их накатываю. ССДТ все равно таких никогда не создаст.
К тому же в реальных условиях может не быть под рукой ССДТ, н-р у заказчика.

На create or alter сподобились аж в 2016. Не прошло и 20 лет.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740437
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgosalexeyvg,

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

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

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


Писать
Код: sql
1.
2.
3.
IF @SERVERNAME = 'имя сервера клиента'
    EXEC('
CREATE OR ALTER TRIGGER Имя_Триггера ON Таблица



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

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

L_argoПри этом Drop+Create не выход, т.к. Create может быть неуспешен, ну и настроенные гранты слетят нафиг.Это я не понял.
Права надо прописывать в скрипте.
А если "Create неуспешен", то, значит, апдэйт не удался, нужно читать ошибку и исправлять (или воосстановить из бакапа, и отослать разработчикам письмо с логом).
Гавриленко Сергей Алексеевич"Дебилы на всю голову" уже давно выпустили SSDT для ленивых. А неленивым уже ничего не поможет, даже если create разрешать писать не в начале батча.ИМХО для задачи ТС не будет разницы между SSDT и нотепадом, писать то скрипты всё равно вручную
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740440
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoНа create or alter сподобились аж в 2016. Не прошло и 20 лет.С одной стороны да, эито минус МС
С другой стороны, это разве что то меняет?
По любому апдэйт кода делается тулзом разработки, либо в виде исходного шаблока для кода процедуры, либо сборщиком - не набираете же вы код процедуры/триггера в скрипте полностью второй раз?
А потом скрипт должен собираться сборщиком апдэйта.
L_argoИ толку с того ССДТ ???
Я сам программно создаю такие, как надо скрипты, а потом их накатываю. ССДТ все равно таких никогда не создаст.
К тому же в реальных условиях может не быть под рукой ССДТ, н-р у заказчика.Да, для работы со сложными проектами БД МС так ничего и не создал с 80-х
Всё тот же make, ну, или свои самодельные программы.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740451
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Права надо прописывать в скрипте.Это не всегда возможно. А что если каждый логин имеет индивидуальную схему Grant-прав (пусть не на все объекты, а на некоторые критичные) ? Я такое встречал.
Перенакат прав - штука небыстрая и нетривиальная, т.к. список дропнутых/пересозданных объектов неочевиден и не всем из них нужен перенакат.
У нас полный перенакат всех прав занимал ок. 1мин. с почти полной блокировкой работы. :(
Зачем проделывать это всё, если достаточно всего лишь ALTER ?
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740461
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoЭто не всегда возможно. Ну в принципе да, хотя индивидуальные права по логинам всё таки сильное исключение
L_argoЗачем проделывать это всё, если достаточно всего лишь ALTER ?Ну это так, зачемание по правам, а вообще ничего не мешает делать только ALTER
У на стандартный шаблон процедуры (триггера) в студии
Код: sql
1.
2.
3.
4.
5.
6.
7.
IF OBJECT_ID ('Имя') IS NULL
    EXEC('CREATE ...') -- тут создаём пустой объект
GO
ALTER ...
........
........
GO


Соответственно всегда делается просто ALTER
L_argoПеренакат прав - штука небыстрая и нетривиальная, т.к. список дропнутых/пересозданных объектов неочевиден и не всем из них нужен перенакат.
У нас полный перенакат всех прав занимал ок. 1мин. с почти полной блокировкой работы. :(Это уже зависит от концепции прав
Если есть некие роли, предназначенные разным группам процедур, то раздача прав делается в скрипте создания самого объекта. И тогда не надо перезаливать все права.
Зачем "все", если мы меняем в апдэйте немногие объекты? Вот для них, которые меняли, и надо назначать права, а не перезаливать всё.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740494
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У наc стандартный шаблон процедуры (триггера) в студииУ меня точно также.
Но хак с EXEC('create ...') конеш это ненормально в 21 веке (кинул камень в сторону MS).

А перезаливка прав - штука специфичная и динамичная для каждого проекта и не хотелось бы массово выносить ее в скрипты.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740495
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoУ наc стандартный шаблон процедуры (триггера) в студииУ меня точно также.
Но хак с EXEC('create ...') конеш это ненормально в 21 веке (кинул камень в сторону MS).

А перезаливка прав - штука специфичная и динамичная для каждого проекта и не хотелось бы массово выносить ее в скрипты.
Всё, что работает, нормально. Впрочем, предложите альтернативы.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740740
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burgos,

Альтернатива - это SSDT и умение работать с ветками GIT. Плюс немного персонала, занимающегося по совместительству формированием поставок. Персонал можно ротировать, чтобы все в курсе были.
...
Рейтинг: 0 / 0
ALTER TRIGGER
    #39740800
Фотография burgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

У нас фирма 26 человек, включая 2 техника, одного comercial, который надоедает потенциальным клиентам и выслушивает претензии не потенциальных, начальника, бухгалтера и 2-х на тестконтроле. Остальные, как принято выражаться, говнокодеры/руководители проектов, часто в одном лице. Можно конечно устроить им ротацию, но не знаю насколько это нужно. :)
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ALTER TRIGGER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]