【发布时间】:2019-10-31 15:11:13
【问题描述】:
首先,我想说这个问题与my previous post有关。
不过,我会将所有内容移到这里以供参考。
我遇到的问题是我仍然收到错误:
消息 6522,级别 16,状态 1,过程 PerfInsert,第 0 行 [批处理开始第 31 行] 执行用户定义的例程或聚合“PerfInsert”期间发生 .NET Framework 错误: System.Security.SecurityException:请求失败。 System.Security.SecurityException: 在 MiddleMan.MiddleMan.CreateCommand(SqlString tblString,SqlString featureName,SqlString connectionString,SqlString perfionConnectionString,SqlString logFile) .
尽管我相信我已经按照所有必要的步骤进行了正确设置。我什至已经验证了 SQL Server 是否具有文件目录的权限。
有谁知道我还能检查什么以查看丢失的部分是什么?
或者我是否需要将其设为“不安全”的程序集?
C#代码:
using Microsoft.SqlServer.Server;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Diagnostics;
namespace MiddleMan
{
public static class MiddleMan
{
[SqlProcedure(Name = "PerfInsert")]
public static SqlInt32 CreateCommand(SqlString tblString, SqlString featureName, SqlString connectionString, SqlString perfionConnectionString, SqlString logFile)
{
Process compiler = new Process();
compiler.StartInfo.FileName = "C:\\SQL Server C# Functions\\PerfionLoader\\PerfionLoader\\bin\\Release\\PerfionLoader.exe";
compiler.StartInfo.Arguments = tblString.Value + " " + featureName.Value + " " + connectionString.Value + " " + perfionConnectionString.Value + " " + logFile.Value;
//compiler.StartInfo.UseShellExecute = false;
//compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
return SqlInt32.Zero;
}
}
}
SQL 代码:
CREATE ASSEMBLY PerfInsert
AUTHORIZATION dbo
FROM '\\bk-int-1\c$\SQL Server C# Functions\MiddleMan\MiddleMan\bin\Release\MiddleMan.dll'
WITH PERMISSION_SET = SAFE
GO
CREATE ASYMMETRIC KEY [Brock.Retail_Brock.Retail_Brock]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = '\\bk-int-1\c$\SQL Server C# Functions\MiddleMan\MiddleMan\bin\Release\MiddleMan.dll';
CREATE LOGIN BrokcRetail
FROM ASYMMETRIC KEY [Brock.Retail_Brock.Retail_Brock]
CREATE PROCEDURE PerfInsert
(
@tblString nvarchar(max)
, @featureName nvarchar(max)
, @connectionString nvarchar(max)
, @perfionConnectionString nvarchar(max)
, @logFiel nvarchar(max)
)
AS EXTERNAL NAME PerfInsert.[MiddleMan.MiddleMan].[CreateCommand]
GO
【问题讨论】:
-
启动一个随机的外部进程肯定不安全。无论如何,这段代码有什么意义?您可以从 SQL Server 代理作业执行外部程序。如果您放松安全性,您可以使用
xp_cmd,但同样,如果代理可以 放松安全性,为什么还要这样做? -
这看起来像是一个经典案例,通过运行或启动您需要的任何代码的客户端应用程序可以更好地解决问题。如果需要从数据库端随意触发的能力,可以设置一个Service Broker队列,等待请求。在 SQL Server 的上下文中启动任意进程是一场安全噩梦。
-
您必须使用 EXTERNAL_ACCESS 或 UNSAFE 并且代码将在 SQL Server 服务帐户下运行。这不是一个好主意。无论你想做什么,你不需要使用 SQLCLR 来做,更不用说允许不安全的代码执行
-
好吧,你肯定需要一个
UNSAFE程序集——如果你使用的是 SQL Server 2017,你会遇到additional difficulties with the new default permissions(由同一类灵魂撰写回答了你的另一个问题,谁也可能会出现在这个问题上)。 -
@PanagiotisKanavos 我当然同意,不幸的是,Microsoft 让 SQLCLR 支持乏善可陈,这令人沮丧且远非理想。但是,我不同意“不完美 == 不可行”的观点。该功能存在并且在许多情况下都可以使用,因此我认为使用它没有整体问题。当然,这个特定的实现可能是不明智的,最好通过
xp_cmdshell或 SQL 代理作业来完成。但是,这通常与 SQLCLR 无关。你不喜欢或不使用它很好,但它并不像你描述的那么糟糕。
标签: c# sql-server sqlclr