TSQL:执行 CLR 存储函数抛出 System.Security.SecurityException 错误
TSQL: execution of CLR stored function throws System.Security.SecurityException error
我需要将文件打包到 TSQL 脚本中的 rar 存档中。所以我从以下 C# 脚本函数编译了 dll:
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction()]
static public SqlInt32 RarFiles(SqlString WORK, SqlString TARGET, SqlString SRC, SqlString SIZE)
{
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = @"C:\Program Files\WinRAR\rar.exe";
p.Arguments = String.Format
(
"a -cfg- -ep1 -idcdp -m5 -r -s -v{0} {1} {2}",
SIZE.ToString(),
TARGET.ToString(),
SRC.ToString()
);
p.WorkingDirectory = WORK.ToString();
Process x = Process.Start(p);
return x.ExitCode;
}
}
使用命令:
%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\csc.exe /target:library c:\test\rarfiles.cs
然后在 TSQL 中我用代码创建了程序集:
ALTER AUTHORIZATION ON DATABASE::[Test] TO [sa];
GO
ALTER DATABASE [Test] SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY [CLRFunctions]
FROM 'C:\test\RarFiles.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO
CREATE FUNCTION [dbo].RarFilesCLR
(
@work [nvarchar](max),
@target [nvarchar](max),
@source [nvarchar](max),
@size [nvarchar](max)
)
RETURNS INT
AS EXTERNAL NAME CLRFunctions.UserDefinedFunctions.RarFiles;
GO
最后,我正在尝试执行函数:
DECLARE @work nvarchar(max) = 'c:\test';
DECLARE @target nvarchar(max) = 'c:\test\res.rar';
DECLARE @source nvarchar(max) = 'c:\test\source';
DECLARE @size nvarchar(max) = '20M';
SELECT [dbo].RarFilesCLR(@work, @target, @source, @size);
会引发错误
System.Security.SecurityException:
in UserDefinedFunctions.RarFiles(SqlString WORK, SqlString TARGET, SqlString SRC, SqlString SIZE)`...
谁能给我解释一下这是怎么回事?
创建大会时您需要使用 UNSAFE
作为权限集。这是您开始新的 Process
.
所必需的
此外,您应该 post 完整的错误消息,因为它通常包含有关正在发生的事情和/或要做什么的线索。仅 posting 错误消息的第一小段会使获得您请求的帮助变得更加困难。
我需要将文件打包到 TSQL 脚本中的 rar 存档中。所以我从以下 C# 脚本函数编译了 dll:
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction()]
static public SqlInt32 RarFiles(SqlString WORK, SqlString TARGET, SqlString SRC, SqlString SIZE)
{
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = @"C:\Program Files\WinRAR\rar.exe";
p.Arguments = String.Format
(
"a -cfg- -ep1 -idcdp -m5 -r -s -v{0} {1} {2}",
SIZE.ToString(),
TARGET.ToString(),
SRC.ToString()
);
p.WorkingDirectory = WORK.ToString();
Process x = Process.Start(p);
return x.ExitCode;
}
}
使用命令:
%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\csc.exe /target:library c:\test\rarfiles.cs
然后在 TSQL 中我用代码创建了程序集:
ALTER AUTHORIZATION ON DATABASE::[Test] TO [sa];
GO
ALTER DATABASE [Test] SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY [CLRFunctions]
FROM 'C:\test\RarFiles.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO
CREATE FUNCTION [dbo].RarFilesCLR
(
@work [nvarchar](max),
@target [nvarchar](max),
@source [nvarchar](max),
@size [nvarchar](max)
)
RETURNS INT
AS EXTERNAL NAME CLRFunctions.UserDefinedFunctions.RarFiles;
GO
最后,我正在尝试执行函数:
DECLARE @work nvarchar(max) = 'c:\test';
DECLARE @target nvarchar(max) = 'c:\test\res.rar';
DECLARE @source nvarchar(max) = 'c:\test\source';
DECLARE @size nvarchar(max) = '20M';
SELECT [dbo].RarFilesCLR(@work, @target, @source, @size);
会引发错误
System.Security.SecurityException:
in UserDefinedFunctions.RarFiles(SqlString WORK, SqlString TARGET, SqlString SRC, SqlString SIZE)`...
谁能给我解释一下这是怎么回事?
创建大会时您需要使用 UNSAFE
作为权限集。这是您开始新的 Process
.
此外,您应该 post 完整的错误消息,因为它通常包含有关正在发生的事情和/或要做什么的线索。仅 posting 错误消息的第一小段会使获得您请求的帮助变得更加困难。