我正在尝试保护我的业务逻辑,但我不想使用“使用加密”,因为它是不够的并且可能会被破坏。
我不想再次用 CLR 语言重新编写程序。
是否有一种简单的方法可以将 TSQL 编程编译为可供 SQL Server 使用的 DLL,就像它使用 CLR 程序集的方式一样?
首先,这是针对 SQL Server 2016 的。如果我在 2017+ 上,我会使用sp_add_trusted_assembly. 在问这个问题之前只是想澄清一下。
如何在不使用 的情况下注册程序集System.DirectoryServices.AccountManagement.dllTRUSTWORTHY ON?我无法使用System.DirectoryServices.dll生成的非对称密钥使其工作。AccountManagement dll 的签名与System.DirectoryServices.dll不同。
我什至尝试从System.DirectoryServices.AccountManagement.dll创建一个单独的非对称密钥,但这会导致:
消息 15468,级别 16,状态 7,行 XXXXX
在生成非对称密钥期间出错。
这是我为尝试创建此程序集而编写的测试脚本。
USE master
IF DB_ID('CLR_Test') IS NULL BEGIN
CREATE DATABASE CLR_Test
END
GO
USE [CLR_Test]
GO
EXEC sp_configure @configname=clr_enabled, @configvalue=1
GO
RECONFIGURE
GO
/*************************************************************************************/
-- DROP OBJECTS IF FOUND FIRST
/*************************************************************************************/
-- DROP System.DirectoryServices.AccountManagement
IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.AccountManagement') BEGIN
RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.AccountManagement]', 0, …Run Code Online (Sandbox Code Playgroud) security sql-server sql-clr active-directory sql-server-2016
我在 Visual Studio 2013 中有一个带有以下签名的 SQLCLR 存储过程:
[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString ExecSql2Json(SqlString sql)
Run Code Online (Sandbox Code Playgroud)
或者我已经尝试过:
[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlChar ExecSql2Json(SqlChar sql)
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,参数和返回类型都被定义为NVARCHAR(4000). 我希望他们成为NVARCHAR(MAX)。
我知道我可以手动编写自己的CREATE PROCEDURE语句来进行细粒度控制。是否有任何选项可以更改 SQL Server 生成的部署 DDL,或者我是否只需要手动添加脚本来删除和读取具有正确签名的 UDF?
这个数据库有一个持久化的计算列,它是通过调用一个 .NET 函数来计算的。在将兼容性从 MSSQL 2005 更改为 2012 时,出现错误 10334,这看起来更像是警告:它告诉我必须将其中一个表标记为 has_unchecked_assembly_data。
它没有告诉我该怎么做。我应该保持原样吗?我应该以某种方式强制重新计算列吗?如何?
alter assembly unchecked data 的文档列出了造成这种情况的几个原因,我认为 #1 是唯一适用于该数据库的原因。它也没有解释如何取消标记这些列。
我有一个 SQL Server 2017 之前的数据库,我恢复到/升级到 SQL Server 2017。在这个数据库中,我有一个 SQLCLR 程序集。程序集被标记为SAFE因为它不执行任何需要更高级别权限的操作,并且数据库已TRUSTWORTHY禁用 / OFF。SQLCLR 函数和存储过程在迁移到 SQL Server 2017 之前按预期工作,但现在当我尝试执行其中任何一个时,我收到以下错误:
消息 10314,级别 16,状态 11,服务器 XXXXXXXXXXX,行 YYYYYY
在 Microsoft .NET Framework 中尝试加载程序集 ID ZZZZZ 时出错。服务器可能会耗尽资源,或者程序集可能不受信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException:无法加载文件或程序集“{assembly_name}”,版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全相关的错误。(来自 HRESULT 的异常:0x8013150A)
我已确认已在服务器/实例上启用 CLR 集成/SQLCLR。
在 SQL Server 中,索引视图是一个充满限制的地狱。但我需要一个。我有一个格式化程序 SQLCLR 函数,它创建域密钥的美化版本 - 用户希望能够搜索该美化版本的子字符串。因此,我需要持久计算列或物化视图上的全文索引。
但是,格式化程序依赖于存储在多个表中的数据。
因此,这适用于视图,但不适用于持久计算列,因为它们无法从多个表进行查询。
我的 SQLCLR 方法是精确且确定的,因此它应该适合在索引视图中使用,但索引视图的索引键中不能包含 SQLCLR。
我可以使用 T-SQL 函数重新实现我的格式化程序FORMAT...但也与索引视图不兼容FORMAT。
索引视图可以做任何事情吗? 曾经?
如果有人可以向我推荐一份关于最佳实践的好文档,我对“使用触发器滚动你自己的物化视图”方法持开放态度。上次我尝试时,它失去了控制,并且插入和更新代码与初始化之间存在巨大的重复。
我是否缺少某种方法来对几百万行的计算数据进行高性能文本搜索,而不使用物化/索引视图或持久计算列?
格式化程序不执行数据访问。但是,我需要输入格式化程序以使其有用的数据将来自多个表(具有良好的常规联接),因此我无法使用持久计算列来解决此问题。我无法为 SQLCLR 列设置键,因此无法在全文索引中使用它。
我以为这很简单。持久列和索引视图旨在在写入时执行计算,并正确实现观察者模式,以便对其依赖项的更改反映在计算值上。
我正在 Windows 7 32 位上使用 SQL Server 2012 Enterprise Edition SP2。
\n\n我在存储过程中有这段代码。
\n\nBegin try\n -- EXEC CLR Stored Procedure\n exec dbo.MyStoredProcedureCLR @baseUrl, @orderNumber\nend try\nbegin catch\n Declare @message nvarchar(max);\n\n set @message = ERROR_MESSAGE()\n EXEC master..xp_logevent 60000, @message, informational\nend catch\nRun Code Online (Sandbox Code Playgroud)\n\nMyStoredProcedureCLR是一个 SQL CLR 存储过程,用于对 RESTful Web 服务进行 PUT。
有时,我会遇到404 Not Found异常,我想捕获它并记录它。这是我收到的消息:
A .NET Framework error occurred during execution of user-defined routine or aggregate "GetNewCodesICODECLR": \nSystem.Net.WebException: Error en el servidor remoto: (404) No se encontr\xc3\xb3.\nSystem.Net.WebException: …Run Code Online (Sandbox Code Playgroud) sql-clr ×7
sql-server ×6
encryption ×1
errors ×1
functions ×1
logs ×1
security ×1
t-sql ×1
varchar ×1