2017-02-13 7 views
1

На днях мы обнаружили таблицу, в которой был столбец ModifiedDate, но обнаружили, что на самом деле не обновлен этот столбец. Теперь я пытаюсь написать сценарий, чтобы найти все таблицы, в которых есть столбец ModifiedDate, но нет триггера для его обновления.Как найти все таблицы, где триггер не существует

Вот то, что я до сих пор:

SELECT so.name AS 'TableName', sc.name AS 'ColumnName', tr.name AS 'Trigger' 
FROM sys.objects so 
INNER JOIN sys.columns sc ON sc.object_id = so.object_id 
LEFT JOIN sys.triggers tr ON so.object_id=tr.object_id 
WHERE so.type = 'U' AND sc.name LIKE '%ModifiedDate%' 
AND tr.type = 'TR' 

Для начала, я хочу, чтобы найти все таблицы, которые имеют как столбец и триггер. Я могу найти все таблицы с столбцом ModifiedDate, но когда я добавляю в это последнее место, где фильтр AND tr.type = 'TR' ничего не возвращает. Я проверил и там есть таблицы, в которых есть как столбец, так и триггер, который я ищу, поэтому я ожидаю увидеть их в списке.

+0

Ваше использование 'WHERE' преобразует' LEFT OUTER JOIN' в 'INNER JOIN'. Вы должны либо разрешить значения «NULL», либо переместить соответствующие условия в предложения 'ON'. – HABO

+0

@ ХАБО И тот факт, что он присоединяется к НЕПРАВИЛЬНОЙ колонке ...? Его запрос с правильным именем столбца (parent_id) выполняет то, что ему нужно. «Для начала я хочу найти все таблицы, в которых есть как столбец, так и триггер». –

ответ

2
SELECT so.name AS 'TableName', sc.name AS 'ColumnName', tr.name AS 'Trigger' 
FROM sys.objects so 
INNER JOIN sys.columns sc ON sc.object_id = so.object_id 
LEFT JOIN sys.triggers tr ON so.object_id=tr.parent_id 
WHERE so.type = 'U' AND sc.name LIKE '%ModifiedDate%' 
AND tr.type = 'TR' 

не ваш соединяет ошибся на триггерах

Очистки вашего запроса, чтобы найти все таблицы, где Есть NO триггеров, где они, возможно, должны быть:

Select t.name As 'TableName' 
     ,c.name As 'ColumnName' 
     ,tr.name As 'Trigger' 
From sys.tables t 
Join sys.columns c On c.object_id = t.object_id 
Left Join sys.triggers tr On t.object_id = tr.parent_id 
Where c.name Like '%ModifiedDate%' 
     And tr.name Is Null 

я вынул некоторые лишние вещи , При выборе на таблицы исключается необходимость искать Type = 'U', а отношение parent_id \ object_id таково, что вам необязательно также применять его с предложением Type = 'TR'.

+0

object_id on sys.triggers - это объект для триггера. Чтобы найти таблицу, к ней подключен триггер parent_id –

+0

Я пробовал этот запрос, но возвращаю результаты только для одной таблицы. Кажется, что левое соединение не работает? –

+0

Запрос выполняет именно то, что вы запросили. Возвращает значения для всех таблиц с триггерами, где таблица имеет столбец с именем ModifiedDate. Я только что проверил его и получил одну строку в первый раз, два после того, как я добавил вторую таблицу с соответствующим именем столбца и триггером. Вы присоединяетесь к логике, это напуганно, и это не сработает для следующего шага, однако мой ответ отвечает именно тому, что было предложено. –