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

Откуда:
Сообщений: 204
Здравствуйте! Задача следующая: при добавлении колонки в таблицу нужно записывать имя таблицы в таблицу history. т.е. если пользователь добавляет колонку в таблицу имя ее нужно записать в history таблицу.

я делаю через DDL триггер на событие ALTER_TABLE. Вопрос в следующем: как вытащить имена полей из xml данных возвращаемых eventdata функцией?
28 ноя 14, 12:37    [16918476]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
relav
Member

Откуда:
Сообщений: 204
XML выражение такое:
<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><PostTime>2014-11-28T11:32:39.560</PostTime><SPID>55</SPID><ServerName>DELL\EPRASYS</ServerName><LoginName>oss</LoginName><UserName>oss</UserName><DatabaseName>arcelor</DatabaseName><SchemaName>oss</SchemaName><ObjectName>t_test1</ObjectName><ObjectType>TABLE</ObjectType><AlterTableActionList><Create><Columns><Name>field25</Name><Name>field26</Name><Name>field27</Name></Columns></Create></AlterTableActionList><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>ALTER TABLE [oss].[t_test1]&#x0D;
ADD [field25] varchar(max) NULL,&#x0D;
    [field26] int,&#x0D;
    [field27] char&#x0D;
</CommandText></TSQLCommand></EVENT_INSTANCE>


как вытащить отсюда имена полей: field25,field26,field27 c помощью XQUERY. Я пробовал делать таким образом:
 SET @fn = @data.value('(/EVENT_INSTANCE/ALTERTABLEACTIONLIST)[1]','varchar(max)');

 SET @fn = @data.value('(/EVENT_INSTANCE/ALTERTABLEACTIONLIST/CREATE/COLUMNS/NAME)[1]','varchar(max)');


и не получается вытащить. В Чем ошибка?
28 ноя 14, 13:21    [16918809]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
регистр?
Guest
А так?

@data.value('(/EVENT_INSTANCE/AlterTableActionList/Create/Columns/Name)[1]','varchar(max)')
28 ноя 14, 13:50    [16919126]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> и не получается вытащить. В Чем ошибка?

xml регистрозависимый.
28 ноя 14, 13:50    [16919127]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
relav
Member

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

точно, какая досадная ошибка))) а как теперь вытащить все поля. Нужен какой-то цикл?
28 ноя 14, 13:54    [16919162]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
relav
daw,

точно, какая досадная ошибка))) а как теперь вытащить все поля. Нужен какой-то цикл?


nodes()
28 ноя 14, 13:55    [16919177]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
select
 stuff(@data.query('for $n in /EVENT_INSTANCE/AlterTableActionList/Create/Columns/Name return concat(", ", $n)').value('.', 'varchar(max)'), 1, 2, '');
28 ноя 14, 14:07    [16919295]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
relav
Member

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

а как мне их вытащить не в строчку, а по отдельности и потом записать в таблицу?
28 ноя 14, 14:42    [16919620]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
relav
а как мне их вытащить не в строчку, а по отдельности и потом записать в таблицу?
Вы уж определитесь. А то вам то "в строчку", то "не в строчку".
select
 t.n.value('.', 'sysname')
from
 @data.nodes('/EVENT_INSTANCE/AlterTableActionList/Create/Columns/Name') t(n);
28 ноя 14, 14:50    [16919678]     Ответить | Цитировать Сообщить модератору
 Re: DDL Триггер  [new]
relav
Member

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

спасибо
28 ноя 14, 15:34    [16920120]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить