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

Откуда:
Сообщений: 20498
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 6.0 (Build 6000: )
Есть DDL триггер
ALTER TRIGGER [createdel] 
	ON DATABASE FOR   CREATE_TABLE, ALTER_TABLE
В теле триггера есть -

--Повесим триггер на основную табличку для хранения истории 
-- Если нет триггера истории, то он создается -------------------------------------------------------------------

if not exists
(
  select 1 from Sys.triggers (nolock) where Name = 'tr_'+@TableName+'_History'
)
begin
	select @MyExec = 
	'CREATE TRIGGER dbo.tr_'+@TableName+'_History on dbo.'+@TableName+'
	for update, delete not for replication
	as
	select * into #deleted from deleted
	select * into #inserted from inserted
	declare @UserName varchar(128)
	set @UserName = user

	exec Eco_UniHistoryTrigger '''+@TableName+''',@UserName'

	exec (@MyExec)
end

Но. При попытке добавить поле в табличку через графический интерфейс SMS получаю ошибку - -
Unable to preserve trigger 'tr_stObN_History'.
There is already an object named 'tr_stObN_History' in the database.

Профилер показывает что DDLтриггер срабатывает на
ALTER TABLE dbo.stObN ADD CONSTRAINT
	PK_stObN PRIMARY KEY CLUSTERED 
	(
	vcode
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

И выходит на создание триггера 'tr_stObN_History - почему? Я же написала проверку на существование этого триггера.
Что я сделала не так?
Спасибо
23 апр 08, 11:50    [5584104]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
При попытке добавить поле в табличку через графический интерфейс SMS получаю ошибку


А что за скрипт нагенерила студия?! Часом не через создание промежуточной таблицы? Очень похоже в контексте наличия ALTER TABLE? При наличии триггера SELECT в EXISTS возвращает результат?
23 апр 08, 11:57    [5584164]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Да. Создает промежуточную таблицу, грохает мою, потом переименовывает свою промежуточную. И добавляет ПК.


==При наличии триггера SELECT в EXISTS возвращает результат?

Эээ... Не поняла вопроса.

Триггер есть - он не грохается (не увидела в профилере чтоб грохался). Но тогда почему select 1 from Sys.triggers (nolock) where Name = 'tr_'+@TableName+'_History' - не показывает что он есть?
23 апр 08, 12:02    [5584211]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
М.б. проблема в видимости метаданных:

In SQL Server 2005, the visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission. For example, the following query returns a row if the user has been granted a permission such as SELECT or INSERT on the table myTable.

SELECT name, object_id
FROM sys.tables
WHERE name = 'myTable';
GO

However, if the user does not have any permission on myTable, the query returns an empty result set.

SQL modules, such as stored procedures and triggers, run under the security context of the caller and, therefore, have limited metadata accessibility.

GRANT VIEW DEFINITION TO public


???
23 апр 08, 12:45    [5584611]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Логинюсь sa - могут ли у sa быть ограничения в доступе к метаданным?
23 апр 08, 12:50    [5584656]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Taffy
Логинюсь sa - могут ли у sa быть ограничения в доступе к метаданным?


По идее нет, но сам запрос не в триггере возвращает запись при наличии триггера?!
23 апр 08, 12:53    [5584684]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Да, триггер - рабочий. Проблемы возникают только тогда когда изменяю тип поля, или добавляю колонку не последней. То есть -когда СМС грохает и переименовывает табличку.
23 апр 08, 12:53    [5584694]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
pkarklin
По идее нет, но сам запрос не в триггере возвращает запись при наличии триггера?!

Возвращает
23 апр 08, 12:54    [5584703]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Taffy
pkarklin
По идее нет, но сам запрос не в триггере возвращает запись при наличии триггера?!

Возвращает


А если колонку добавлять не через студию, а ALTERом?
23 апр 08, 12:57    [5584735]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Проблемы возникают только тогда когда изменяю тип поля, или добавляю колонку не последней. То есть -когда СМС грохает и переименовывает табличку.
Если сама делаю ALTER TABLE - все супер-пупер.
23 апр 08, 13:01    [5584772]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Taffy
Проблемы возникают только тогда когда изменяю тип поля, или добавляю колонку не последней. То есть -когда СМС грохает и переименовывает табличку.
Если сама делаю ALTER TABLE - все супер-пупер.


А в скрипте от студии нет ли часом явного создания триггера?
23 апр 08, 13:02    [5584786]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Отключила DDL-триггер
Добавила колонку и посмотрела трассу.
Все поняла.
Сервер грохает мою табличку. Потом переименовывает свою. Потом добавляет к ней все прибамбасы. В этот момент срабатывает мой DDLтриггер - видит - ага, триггера нет -и вешает триггер. А потом сервер ничтоже сумняшись тоже вешает этот же триггер. Без проверки! Гад.

Теперь возник вопрос - как мне понять в DDLтриггере что сервер щас захочет создать триггер. То есть надо добавить условие к not exists. Какое, интересно?
23 апр 08, 13:17    [5584925]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Теперь возник вопрос - как мне понять в DDLтриггере что сервер щас захочет создать триггер.


Боюсь, что никак, ибо бач создания триггера никак не связан с инструкцией, вызвавшей срабатывание триггера.
23 апр 08, 13:21    [5584955]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Вывод - а не фиг пользоваться графическими инструментами. Надо все ручками делать.
:(
23 апр 08, 13:57    [5585243]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Taffy
Вывод - а не фиг пользоваться графическими инструментами. Надо все ручками делать.


+1
23 апр 08, 14:01    [5585278]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: DDL триггер  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition on Windows NT 6.0 <X86> (Build 6000: )

Поставили мне 2008
Дошли руки проверить - исправлено ли

И ничего не поменялось :(
Ну почему они не проверяют на наличие триггера перед тем как его вешать?
риторический вопрос...
28 окт 09, 09:57    [7847745]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а почему он должен ето делать ??? ну по логике то
-------------------------------------
Jedem Das Seine
28 окт 09, 15:22    [7850726]     Ответить | Цитировать Сообщить модератору
 Re: DDL триггер  [new]
Taffy
Member

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

потому что начиная с 2005 сервера появились DDL-триггера
и писатели СМС могли бы предположить что пользователь ихней системы (то бишь разработчик) может написать в этом триггере что угодно. И потому теперь надо проверять - а не понаписал ли сам пользователь-разработчик что-нибудь эдакого...
По-моему логично
ЗЫ
Позабавило - в 2008-м теперь есть параметр запрещающий действия со структурой таблицы, которые могут привести к пересозданию таблицы.
29 окт 09, 11:21    [7854483]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить