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

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

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
Сообщений: 9103
TaPaK,

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

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

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

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

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

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

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

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

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


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

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

Откуда:
Сообщений: 5977
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

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

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

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

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

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

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


Это попробую!!!
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

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

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

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


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

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

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

Откуда: España
Сообщений: 9103
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

Откуда: Москва
Сообщений: 46487
Решение в лоб - написать в динамике 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
Сообщений: 9103
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

Откуда: Москва
Сообщений: 46487
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

Откуда: Москва
Сообщений: 46487
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
Сообщений: 9103
alexeyvg,

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

Откуда: España
Сообщений: 9103
Спасибо всем!
:)
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
Сообщений: 9103
WarAnt
burgos,

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


Это запускаю не я, а техники при актуализации приложения. Люди они нежные, при любом сообщении об ошибке впадающие а депрессию, из которой их вывести практически невозможно.
28 ноя 18, 18:10    [21747751]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить