Mis*_*Tom 6 t-sql blob zlib deflatestream dynamics-nav
我希望能够直接从 SQL Server 数据库读取Dynamics NAV 2013 表元数据,而无需 NAV 开发环境。
我可以使用如下查询查看二进制 SQL“图像”BLOB 列(使用 WHERE 子句进行适当的过滤):
SELECT
o.[Name],
m.[Object Type],
m.[Metadata], -- XML Metadata
m.[User Code], -- C# Metadata
m.[User AL Code] -- C/AL Metadata
FROM [Navision].[dbo].[Object Metadata] AS m
JOIN [Navision].[dbo].[Object] AS o
ON m.[Object ID] = o.[ID]
AND o.[Company Name] = 'YourCompanyName'
AND o.[Type] = 0 -- 0 is NAV Table Object Type
Run Code Online (Sandbox Code Playgroud)
我可以使用 .Net 代码或带有 SQL 驱动程序的快速脚本将来自 [元数据]、[用户代码] 和 [用户 AL 代码] 的二进制数据保存到文件中。我尝试使用 7-zip 解压缩,使用十六进制编辑器查看,以及 Cygwin“文件”命令来检测这些 BLOB 文件类型。
不幸的是,我无法弄清楚如何将二进制数据解码或解压缩为可读或可用的格式。在我可以直接使用这些字段中的数据之前,我必须打开 NAV Dev Environment 并使用对象设计器查看零基查找列表下拉菜单的逗号分隔 OptionString 属性(列表中的每个项目都存储在后端数据库作为整数 - 第一项为 0,第二项为 1,等等)。字符串值不存在于 SQL 查找表中,但 NAV 确实将它们放在表元数据 blob 中。
这是我作为 DBA 完全支持我的 NAV 用户而无需 NAV 开发人员为我查找这些数字到名称 NAV 自定义字段映射的缺失链接。然后,我可以查找这些列表值并根据需要创建匹配的 SQL CASE 语句或自定义查找表。
有了这篇文章后,我应该能够创建高级 SQL 视图、查询、报告和工具,而无需访问 Dynamics NAV 前端用户或开发人员工具。
如果您了解用于这些 NAV 对象元数据 blob 属性的二进制数据格式,请告诉我。关于如何转换为可读或可用格式的任何建议都会有所帮助。
我能够从deV.ch - man vs. code,Dynamics NAV & C# .NET 博客的作者那里得到有关这些元数据二进制字段格式的答案。基于 devch 的逆向工程,我们确定 NAV 使用这些字段的前四个字节(32 位)来存储确定自定义 NAV Blob 类型的“幻数”。
对于这些元数据字段,NAV 压缩 Blob 类型幻数是 0x02457d5b(十六进制)。为了使用标准的 .Net DeflateStream 进行解压缩,只需丢弃前四个幻数字节,然后像往常一样使用 DeflateStream 处理流的其余部分。
我能够使用 .Net 成功测试此过程,现在我计划使用 Python 或其他一些非 Microsoft deflate 工具进行测试,以查看 deflate 实现是否符合行业标准。再次感谢 devch 提供的导致此解决方案的文章:Accessing Compressed Blob from external NAV (NAV2013) (Revisited)。
更新:使用 Python zlib 进行测试并且可以正常工作!删除自定义 NAV Blob 类型幻数后,将使用符合标准的 Deflate 算法。这是一些示例代码(Python):
# Example Using Python 3.x
import zlib, sys, struct
# NAV custom Blob-Type identifier (first 4 bytes)
magic = struct.unpack('>I',sys.stdin.buffer.read(4))[0]
print('magic number = %#010x' % magic, file=sys.stderr)
# Remaining binary data is standard DEFLATE without header
input = sys.stdin.buffer.read()
output = zlib.decompress(input,-15)
sys.stdout.buffer.write(output)
Run Code Online (Sandbox Code Playgroud)
使用类似以下内容进行测试:
python -u test.py < Input_Meta.blob > Output_Meta.txt
Run Code Online (Sandbox Code Playgroud)
当然 .Net DeflateStream 也可以在删除前四个字节后工作。此示例只是为了表明您不仅限于使用 .Net 语言。