COLUMNS_UPDATED()从表中间的列开始跳过一点

时间:2019-05-21 13:30:49

标签: sql-server sql-server-2016

我在触发器中使用COLUMNS_UPDATED()来标识应将其值写入审核表的那些列。触发器/审计已经运行了好多年。昨天我注意到审计不再持续进行。

我已在底部列出了该表的前四十列,以供参考,以及INFORMATION_SCHEMA.COLUMNS中的ORDINAL_POSITION。该表共有109列。

我将print COLUMNS_UPDATED()添加到触发器中以获取一些调试信息。

当我更新第9列CurrentOnFleaTick时,我看到此打印:

0x0001000000000000000000000000

这是预期的-第9列应表示为第二个字节的最低有效位。同样,如果我更新HasAttackedAnotherAnimalExplanation,则会看到以下内容:

0x0000010000000000000000000000

同样,期望-第17列应表示为第三个字节的最低有效位。

但是...当我更新HouseholdIncludesCats时,我看到了:

0x0000000200000000000000000000

没想到!您看到2的地方应该有一个1,因为HouseholdIncludesCats的序数位置为25,使其成为第四字节中表示的第一列,并应以最低有效位表示那个字节。

我通过更新HasAttackedAnotherAnimalExplanationHouseholdIncludesCats之间的每一列来缩小范围,发现我遇到的“一个人离开”问题从HouseTrainedId开始,顺序位置为24。我期望更新HouseTrainedId

0x0000800000000000000000000000

但是我得到了

0x0000000100000000000000000000

我认为这是错误的,这是我期望获得的HouseholdIncludesCats列更新的结果。

我不认为面具应该跳过。掩码当前未使用第3个字节的最高有效位。

我最近确实删除了一列,但没有记录其顺序位置。基于将要创建该表的原始代码,我相信所删除的列的序号位置不是24。(我认为是7 ...它是在BreedIds之后定义的。) / p>

我不一定要寻找更深层的根本原因。如果有什么我可以重设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 个答案:

答案 0 :(得分:1)

所以...我以为在发布此内容之前我已经在Google上搜索了足够多的内容,但我想还没有。我发现了:

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

使用COLUMNPROPERTY()来获得ColumnID绝对是必经之路。