InterBase. Адский домен :)

Привет всем.

Один наш пользователь, если верить переписке, через 9.5 месяцев таки асилил создание бакапа своей проблемной базы данных и прислал её нам. Linked Server [MS SQL 2005] отказывался с ней работать через IBProvider. 100% — охинея в системных таблицах.

База от IB7.x. Хотя, скорее всего, она была рождена более ранними версиями IB.

Я её восстановил сервером [7.5.1.80]. Содержимое не очень удивило. В отличии от имени домена, первой обнаруженной проблемной колонки 🙂


[Interbase 7.5] Wrong VARCHAR domain

Я не смог заставить IBE выдать мне результаты запроса к RDB$FIELDS в нужном текстовом виде (не асилил?). Поэтому накатал скриптик на VBS, который заработал с 10 пинка 🙂

option explicit

dim cn
set cn=createobject("ADODB.Connection")

cn.Provider="LCPI.IBProvider.3"

cn.Properties("location")    ="vxpsp2-ib75:e:\database\trams.gdb"
cn.Properties("user id")     ="SYSDBA"
cn.Properties("password")    ="masterkey"
cn.Properties("auto_commit") =true

call cn.Open()

dim rs
set rs=cn.Execute _
 ("select f.*"&vbCrLf& _
  "from rdb$relation_fields rf"&vbCrLf& _
         "join rdb$fields f"&vbCrLf& _
        "on rf.rdb$field_source=f.rdb$field_name"&vbCrLf& _
  "where rf.rdb$relation_name='ACTIVITY' and"&vbCrLf& _
        "rf.rdb$field_name='USERNAME'")

dim i,line

while(not rs.eof)
 for i=0 to rs.Fields.Count-1
  line=cstr(i)&". ["&rs(i).Name&"]= "

  if(IsNull(rs(i).value))then
   line=line&"#NULL"
  else
   line=line&"["&cstr(rs(i).value)&"]"
  end if

  wscript.echo line
 next

 call rs.movenext()
wend

И получил следующие данные

0. [RDB$FIELD_NAME]= [RDB$6666]
1. [RDB$QUERY_NAME]= []
2. [RDB$VALIDATION_BLR]= #NULL
3. [RDB$VALIDATION_SOURCE]= #NULL
4. [RDB$COMPUTED_BLR]= #NULL
5. [RDB$COMPUTED_SOURCE]= #NULL
6. [RDB$DEFAULT_VALUE]= #NULL
7. [RDB$DEFAULT_SOURCE]= #NULL
8. [RDB$FIELD_LENGTH]= [20]
9. [RDB$FIELD_SCALE]= [0]
10. [RDB$FIELD_TYPE]= [37]
11. [RDB$FIELD_SUB_TYPE]= [0]
12. [RDB$MISSING_VALUE]= #NULL
13. [RDB$MISSING_SOURCE]= #NULL
14. [RDB$DESCRIPTION]= #NULL
15. [RDB$SYSTEM_FLAG]= [0]
16. [RDB$QUERY_HEADER]= #NULL
17. [RDB$SEGMENT_LENGTH]= #NULL
18. [RDB$EDIT_STRING]= []
19. [RDB$EXTERNAL_LENGTH]= #NULL
20. [RDB$EXTERNAL_SCALE]= #NULL
21. [RDB$EXTERNAL_TYPE]= #NULL
22. [RDB$DIMENSIONS]= #NULL
23. [RDB$NULL_FLAG]= #NULL
24. [RDB$CHARACTER_LENGTH]= [15]
25. [RDB$COLLATION_ID]= #NULL
26. [RDB$CHARACTER_SET_ID]= [0]
27. [RDB$FIELD_PRECISION]= #NULL

Сдается мне, сначала USERNAME был создан с длиной 15 символов. А потом это поле увеличили до 20 символов. При этом сервер RDB$FIELD_LENGTH изменил, а про RDB$CHARACTER_LENGTH — забыл.

Будем лечить.

One Comment

Утилита для поиска ошибок в системных таблицах | Блог разработчика IBProvider | Инновации для Firebird и Interbase  on 26 сентября, 2011

[…] провайдера, о котором я упоминал в «Адском домене», асилил обновление системной таблицы RDB$FIELDS и […]

Leave a Comment