2017-11-08 17 views
4

내가 쿼리 실행 테이블 스키마 변경의 역사를 얻으려면 해석하는 방법 다음

select CAST(SUBSTRING(f.rdb$descriptor FROM 1 FOR 32000) AS VARCHAR(32000)) log 
from rdb$formats f 
join rdb$relations r on r.rdb$relation_id = f.rdb$relation_id 
where r.rdb$relation_name = 'MY_TABLE_NAME' 

Documentation 상태 :

RDB의 $ 기술자를 | BLOB FORMAT | 저장 열 이름 및 데이터들은 포맷의 기록은 다음

을 생성 된 시간이었다로, BLOB로 속성을 쿼리의 결과입니다

LOG             TABLE FORMAT ID 
------------------------------------------------- ----------------  
4: type=9 (LONG) length=4 sub_type=0 flags=0x0  15 
8: type=9 (LONG) length=4 sub_type=0 flags=0x0 
12: type=14 (DATE) length=4 sub_type=0 flags=0x0 
16: type=9 (LONG) length=4 sub_type=0 flags=0x0 
20: type=9 (LONG) length=4 sub_type=0 flags=0x0 
24 <-- probably truncated? 
------------------------------------------------- ---------------- 
4: type=9 (LONG) length=4 sub_type=0 flags=0x0  16 
8: type=3 (VARCHAR) length=12 sub_type=52 flags=0x0 
20: type=14 (DATE) length=4 sub_type=0 flags=0x0 
24: type=9 (LONG) length=4 sub_type=0 flags=0x0 
28: type=9 (LONG) length=4 sub_type=0 flags=0x0 

이벤트의 28 행에 있습니다 테이블의 합계입니다. 하지만, 28 좋아요 숫자 4, 8, 12, 16, 20, 24, 뒤의 의미를 이해의 다음과 같은 쿼리를 발행 할 수 없습니다

: 여기

SELECT 
    RF.RDB$FIELD_POSITION, 
    RF.RDB$FIELD_ID, 
    F.RDB$FIELD_TYPE, 
    F.RDB$FIELD_SUB_TYPE 
FROM RDB$RELATION_FIELDS RF 
JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE) 
WHERE RF.RDB$RELATION_NAME = 'MY_TABLE_NAME' 
ORDER BY RF.RDB$FIELD_POSITION; 

그리고 것은 결과입니다 당신은 어느 위치, 난 단지 22 열이 볼 수 있듯이 the results

ID 위의 로그에서 24/28 키를 일치시킬 수 있습니다.

또 다른 결과는 로그에 sub_type=52과 함께 type=3 (VARCHAR)이 있고 반면에 37은 VARCHAR의 코드입니다.

현재 무슨 일입니까? 어떻게 해석합니까?

+0

질문 당 하나의 질문에 자신을 제한하십시오, 아리옥 '는 대답했다 질문 ,하지만 하위 형식에 대한 귀하의 질문은 정말 별도의 질문이 있어야합니다. –

+0

W.R.T. 마지막 질의에'RDB $ RELATIONS.RDB $ FORMAT' 필드를 추가하십시오. –

+0

한 가지 더 제안 : IBExpert의 "Database Inside"- FDB 파일의 내장 파서를 사용하십시오. 특히 데이터 페이지의 시작 부분에 다른 형식 ID가있는 관심있는 테이블 행을 찾을 수 있습니다. 더 오래된 행이 더 많이 남아있을 수 있습니다. 그런 다음 다른 형식 ID로 행을 열고 데이터 레이아웃 및 설명을 확인하십시오. –

답변

6

나는 번호 4, 8, 12, 16, 20, 24, 28

사람들은 압축 해제 된 메모리 버퍼에 바이트 포인터 오프셋입니다 뒤에 의미를 이해할 수 없습니다.

모든 Format = 15 행의 길이는 같은 "길이 = 4"열입니다.
그리고 그 사이에 완전히 차이는 "4, 8, 12, 16, 20, 24"포맷 = 16 행에서

길이 4, 12, 4, 4, 4
되며들은 매칭되는 오프셋 사이의 갭 : 4, 8, 20, 24, 28

  • 포인터 오프셋 1 + 1 = 2 포인터
  • 포인터 오프셋 2 + 2 = 3 포인터
  • 등등
,

당신이 낮은 수준을 이동해야하는 경우 다음 낮은 수준의 문서 읽기 :

  • "API 가이드"- https://www.firebirdsql.org/en/reference-manuals/
  • "파이어 버드 내부 구조 (진행중인 작업)"- 동일 링크로
  • c:\Program Files\Firebird\Firebird_2_1\include\ibase.h - dtype_XXX 및 관련 상수
  • 파스칼의 C++ 또는 UIB의 IB ++와 같은 인 메모리 구조를 구문 분석하는 FLOSS 저수준 라이브러리. 이들은 유형 및 하위 유형을 파싱하여 의미있는 방식으로 원시 메모리 데이터를 보간합니다.

    당신이 IBExpert언급 한 이후

    select CAST(SUBSTRING....

, 난 당신의 내장에서 BLOB 뷰어를 사용하여 내부 RDB$Formats.rdb$descriptor 값을보고하는 것이 좋습니다. 로그에 하나의 매개 변수가 누락되어 숫자 필드에 중요합니다. 아래는 하나의 테이블에서 덤프입니다. 반면 37

Type=16 Scale=0 Length=8 Subtype=0 Flags=0 Offset=8 
Type=17 Scale=4 Length=8 Subtype=1 Flags=0 Offset=16 

는 VARCHAR의 코드이다.

는 다시 소스를 읽을 - BLR 이진 언어 표현을 의미

#define blr_varying    (unsigned char)37 
    #define blr_varying2   (unsigned char)38 

ibase.h - 그것은 내부 파이어 버드의 바이트 코드, 그 개인 반 컴파일 "가상 머신"입니다. 나는 진심으로 당신이 정말로 저수준 구현 세부 사항으로 가고 싶지 않다고 생각합니다.

는 업데이트 : "37 VARCHAR의 코드 반면"실제로 크게 해당 테이블 설명에 설명되어 있습니다 : 접두사에 대한
https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref-appx04-fields.html

+0

일반적으로 IBExpert와 같은 제품 이름은 코드 형식이 아니어야합니다. –

+0

@MarkRotteveel은 이름이 지정된 상수로 간주합니다 .-D –