InterBase. Адский домен :)
Привет всем.
Один наш пользователь, если верить переписке, через 9.5 месяцев таки асилил создание бакапа своей проблемной базы данных и прислал её нам. Linked Server [MS SQL 2005] отказывался с ней работать через IBProvider. 100% — охинея в системных таблицах.
База от IB7.x. Хотя, скорее всего, она была рождена более ранними версиями IB.
Я её восстановил сервером [7.5.1.80]. Содержимое не очень удивило. В отличии от имени домена, первой обнаруженной проблемной колонки 🙂
Я не смог заставить 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 — забыл.
Будем лечить.
Утилита для поиска ошибок в системных таблицах | Блог разработчика IBProvider | Инновации для Firebird и Interbase on 26 сентября, 2011
[…] провайдера, о котором я упоминал в «Адском домене», асилил обновление системной таблицы RDB$FIELDS и […]