COLUMNS_UPDATED () немного пропускает, начиная со столбцов в середине таблицы - PullRequest
0 голосов
/ 21 мая 2019

Я использую COLUMNS_UPDATED () в триггере для определения тех столбцов, значения которых должны быть записаны в таблицу аудита. Триггер / аудит работал нормально в течение нескольких лет. Вчера я заметил, что одитинг больше не работает последовательно.

Я перечислил первые сорок столбцов рассматриваемой таблицы внизу для справки вместе с ORDINAL_POSITION из INFORMATION_SCHEMA.COLUMNS. Всего в таблице 109 столбцов.

Я добавил print COLUMNS_UPDATED() к своему триггеру, чтобы получить отладочную информацию.

Когда я обновляю CurrentOnFleaTick, 9-й столбец, я вижу следующее:

0x0001000000000000000000000000

Это ожидается - 9-й столбец должен быть представлен как младший значащий бит второго байта. Точно так же, если я обновляю HasAttackedAnotherAnimalExplanation, я вижу это:

0x0000010000000000000000000000

Опять же, ожидается - 17-й столбец должен быть представлен как младший значащий бит третьего байта.

Но ... когда я обновляю HouseholdIncludesCats, я вижу это:

0x0000000200000000000000000000

Не ожидается! Там, где вы видите 2, должно быть 1, так как порядковая позиция HouseholdIncludesCats равна 25, что делает его первым столбцом, представленным в четвертом байте, который должен быть представлен в младшем значащем бите этого байта.

Я сузил дело, обновив каждый столбец между HasAttackedAnotherAnimalExplanation и HouseholdIncludesCats и обнаружил, что проблема «выключено одним» у меня начинается с HouseTrainedId, порядковый номер 24. При обновлении HouseTrainedId I ' ожидаю

0x0000800000000000000000000000

но вместо этого я получаю

0x0000000100000000000000000000

что я считаю неправильным, и это то, что я ожидаю получить за обновления в столбце HouseholdIncludesCats.

Я не верю, что маска должна пропустить. В настоящее время маска не использует самый старший бит 3-го байта.

Я недавно уронил столбец, но у меня нет записи о его порядковом положении. Основываясь на исходном коде, который создал бы таблицу, я считаю, что порядковый номер отброшенного столбца был НЕ 24. (Я думаю, что это было 7 ... Это было определено после BreedIds.)

Я не обязательно ищу глубокое определение первопричины. Если бы я мог что-то сделать для сброса любых внутренних данных, которые использует SQL Server, это было бы хорошо. Вроде как идея перестроить индекс для метаданных таблицы? Есть ли что-то подобное, что может это исправить?

Заранее спасибо за полезные ответы! :)

COLUMN_NAME ORDINAL_POSITION
PetId   1
AdopterUserId   2
AdoptionDeadline    3
AgeMonths   4
AgeYears    5
BreedIds    6
Color   7
CreatedOn   8
CurrentOnFleaTick   9
CurrentOnHeartworm  10
CurrentOnVaccinations   11
FoodTypeId  12
GenderId    13
GuardianForMonths   14
GuardianForYears    15
HairCoatLength  16
HasAttackedAnotherAnimalExplanation 17
HasAttackedAnotherAnimalId  18
HasBeenReferredByShelter    19
HasHadTraining  20
HasMedicalConditions    21
HasRecentlyBittenExplanation    22
HasRecentlyBittenId 23
HouseTrainedId  24
HouseholdIncludesCats   25
HouseholdIncludesChildren5to10  26
HouseholdIncludesChildrenUnder5 27
HouseholdIncludesDogs   28
HouseholdIncludesOlderChildren  29
HouseholdIncludesOtherPets  30
HouseholdOtherPets  31
KnowsCommandDown    32
KnowsCommandPaw 33
KnowsCommandSit 34
KnowsCommandStay    35
KnowsOtherCommands  36
LastUpdatedOn   37
LastVisitedVetOn    38
ListingCodeId   39
LitterTypeClumping  40

1 Ответ

1 голос
/ 21 мая 2019

Итак ... Я думал, что достаточно погуглил, прежде чем опубликовать это, но, похоже, я этого не сделал. Я нашел это:

https://www.sqlservercentral.com/forums/topic/columns_updated-and-phantom-fields

использование COLUMNPROPERTY() для получения ColumnID - определенно путь.

...