从 SQL Server 2005 中提取 .NET 程序集
我正在尝试帮助一位私人朋友(现在也是客户)使用 SQL CLR 相关问题。他有一个 SQL Server,其中的数据库有 3 个 .NET 程序集 嵌入其中。他让我帮他从里面提取组件 数据库并将它们保存为磁盘上的 .dll 文件。这可能吗?
I am trying to help a personal friend (who now also is a client) with a SQL CLR
related problem. He has a SQL Server with a database that has 3 .NET assemblies
embeded in it. He asked me to help him extract the assemblies from within the
database and save them as .dll files on the disk. Is this even possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
是的,这是可能的。程序集的实际二进制表示形式
在您的服务器的 SQL 目录中。也就是说,如果您在
sys.assemblies_files 和 sys.assemblies 你可以得到你想要的所有信息
需要。程序集二进制文件位于 sys. assembly_files 的内容列中
看法。
但是为了从 SQL Server 中提取二进制表示形式并将其转换为
磁盘上的文件,您将必须编写一些需要在磁盘上运行的.NET代码
您引用的程序集现在所在的数据库相同。视觉上
Studio 启动一个 SQL CLR 项目并使用以下代码向其中添加一个类:
然后构建该项目并将其部署到数据库。确保 CLR
在 SQL Server 上启用启用配置选项。这大概是
已经启用,因为上面有程序集。如果 clr 执行不
启用后,您可以在 SSMS 上运行以下代码来启用它:
您还需要注意的另一件事是,默认情况下 SQL Server 可能会
不允许您从 .NET 代码写入磁盘。如果你得到一个 FileIO
通过调用以下存储过程来运行上述代码时出现安全错误
SSMS,您需要为
集会。您可以通过 SSMS 执行此操作:右键单击新程序集并查看
属性对话框中的权限集。将其设置为外部访问。现在轮到你
应该能够通过在 SSMS 中运行以下代码来导出程序集:
希望这对您有用...
Yes, this is possible. The actual binary representation of the assemblies live
in the SQL catalog for your server. Namely, if you run a join between
sys.assembly_files and sys.assemblies you can get to all the information you
need. The assemblies binary is in the content column of the sys.assembly_files
view.
But in order to extract the binary representation from SQL Server and into a
file on disk you will have to write some .NET code that needs to run on the
same database where the assemblies you refer to are located now. In Visual
Studio start a SQL CLR project and add a class to it with the following code:
Then build the project and deploy it to your database. Make sure that the CLR
Enabled configuration option is enabled on the SQL Server. This is probably
already enabled, since you have assemblies on it. In case clr execution is not
enabled you can run the following code on SSMS to enable it:
One more thing that you need to be aware of is the by default SQL server may
not allow you to write to the disk from the .NET code. If you get a FileIO
security error when you run the code above by calling the stored procedure in
SSMS, you will need to configure the proper permission set for the
assembly. You can do this via SSMS: right-click the new assembly and look at
the Permission Set in the Properties dialog. Set it to External Access. Now you
should be able to export your assemblies by running the following code in SSMS:
Hope this works for you...
是的。
执行
select * from sys.assemble_files
来查找所需程序集的 idYes.
do a
select * from sys.assembly_files
to find the id of the assembly you wantJonas 的方法也可以很好地用作控制台应用程序或 Linqpad 脚本 - 正如他所暗示的那样,代码不需要在 SQL 进程中本地执行。例如,从数据库中提取 tSQLt 程序集(测试工具):
Jonas' approach works fine as a Console app or Linqpad script also - there's no need for the code to be executed locally within the SQL process, as he implies. eg extracting the tSQLt assembly (a testing tool) from a database:
Preet 的解决方案对我有用,但我必须配置 Ole Automation 才能在 SQL Server 2008 R2 上工作。另请注意,SaveToFile 不起作用,也不会给出错误消息,除非 SQL Server 具有该目录的权限。就我而言,我使用了 SQL Server 实例的数据文件夹,效果很好。
Preet's solution worked for me, but I had to configure Ole Automation to work on SQL Server 2008 R2. Note also that the SaveToFile doesn't work--neither does it give an error message--unless SQL Server has permissions to that directory. In my case I used the data folder of the SQL Server instance which worked fine.
我找到了解决此问题的更简单的解决方案,这是必要的,因为 sp_OACreate 似乎不适用于 SQL Server 2017(至少不适用于 Linux 版本)。
您可以使用 BCP 实用程序将程序集写入磁盘上的文件,如下所示:
并使用此格式文件 (bcp.fmt):
生成的文件 (/tmp/my_ assembly.so) 可用于创建装配,像这样:
I have found a simpler solution to this problem, which was necessary because
sp_OACreate
does not seem to be available for SQL Server 2017 (at least, not the Linux version).You can just use the BCP utility to write the assembly to a file on disk, like so:
And use this format file (bcp.fmt):
The resulting file (/tmp/my_assembly.so) can be used in the creation of an assembly, like so:
采用 Preet 和 Nate 的解决方案并将其转换为一个脚本,该脚本将使用游标导出所有 clr 过程:
Taking Preet and Nate's solutions and turning them into a script that will export ALL clr procs using a cursor:
无需任何编码的替代解决方案是 VisualStudio 数据库项目。
创建新的数据库项目并导入您的数据库与程序集。您将获得 DDL 脚本和程序集。
请注意,您需要 安装适用于 Visual Studio 的 SSDT。
Alternative solution without any coding is VisualStudio database project.
Create a new database project and import your database with an assembly. You will get DDL scripts together with assemblies.
Note, you will need to install SSDT for Visual Studio.