我在触发器中使用COLUMNS_UPDATED()来标识应将其值写入审核表的那些列。触发器/审计已经运行了好多年。昨天我注意到审计不再持续进行。
我已在底部列出了该表的前四十列,以供参考,以及INFORMATION_SCHEMA.COLUMNS中的ORDINAL_POSITION。该表共有109列。
我将print COLUMNS_UPDATED()
添加到触发器中以获取一些调试信息。
当我更新第9列CurrentOnFleaTick
时,我看到此打印:
0x0001000000000000000000000000
这是预期的-第9列应表示为第二个字节的最低有效位。同样,如果我更新HasAttackedAnotherAnimalExplanation
,则会看到以下内容:
0x0000010000000000000000000000
同样,期望-第17列应表示为第三个字节的最低有效位。
但是...当我更新HouseholdIncludesCats
时,我看到了:
0x0000000200000000000000000000
没想到!您看到2
的地方应该有一个1
,因为HouseholdIncludesCats
的序数位置为25,使其成为第四字节中表示的第一列,并应以最低有效位表示那个字节。
我通过更新HasAttackedAnotherAnimalExplanation
和HouseholdIncludesCats
之间的每一列来缩小范围,发现我遇到的“一个人离开”问题从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
答案 0 :(得分:1)
所以...我以为在发布此内容之前我已经在Google上搜索了足够多的内容,但我想还没有。我发现了:
https://www.sqlservercentral.com/forums/topic/columns_updated-and-phantom-fields
使用COLUMNPROPERTY()
来获得ColumnID
绝对是必经之路。