sql-server - 如何为 Microsoft SQL Server 中的特定数据库启用 CLR 集成?

标签 sql-server sqlclr

CLR integration默认情况下禁用。我的理解instructions启用它意味着对整个服务器启用或禁用它。是否可以在每个数据库的基础上启用它?如果是这样,怎么办?

最佳答案

启用“CLR 集成”仅是服务器/实例级别的选项;它不能按数据库单独处理。

但是,虽然我不确定为什么在每个数据库的基础上处理这个问题很重要,但您始终可以在不希望使用自定义 SQLCLR 代码的数据库中DENY CREATE ASSEMBLY

更新

我刚刚测试了DENY CREATE ASSEMBLY TO [Public];,这对于属于sysadmin固定服务器角色成员的登录名不起作用。因此,有效拒绝某个操作权限的另一种方法是通过 DDL Trigger 捕获该操作。并发出 ROLLBACK 这将取消该操作。

以下是一个 DDL 触发器,它可以在创建它的任何数据库中工作,并捕获 CREATE ASSEMBLYALTER ASSEMBLY 语句,但仍然允许 DROP ASSEMBLY (使用 DDL_ASSEMBLY_EVENTS 作为事件组将禁止所有这三个操作):

USE [db_name];
GO
CREATE TRIGGER [PreventCreateAssembly]
ON DATABASE
AFTER ALTER_ASSEMBLY, CREATE_ASSEMBLY -- DDL_ASSEMBLY_EVENTS
AS

RAISERROR(N'Cannot CREATE or ALTER Assemblies!', 16, 1);
ROLLBACK;
GO

使用此 DDL 触发器后,当我尝试创建程序集时,即使我的登录名是sysadmin,我现在也会收到以下错误:

Msg 50000, Level 16, State 1, Procedure PreventCreateAssembly, Line 59
Cannot CREATE or ALTER Assemblies!
Msg 3609, Level 16, State 2, Line 54
The transaction ended in the trigger. The batch has been aborted.

关于sql-server - 如何为 Microsoft SQL Server 中的特定数据库启用 CLR 集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37744725/

相关文章:

sql-server - Qt中如何调用带入参的sql server存储过程

sql-server - 从 XML 元素解析多个值

sql-server - 模式验证 : missing table [SEQUENCE_NAME] when using Hibernate Sequence Generator Strategy

sql-server - SQL Server 中动态 SQL 中 Oracle 绑定(bind)变量的等价物是什么?

SQL Server 使用子查询从行到列

c# - 如何从数据库中获取 SQL CLR 函数的定义

sql-server - SQLCLR 静态类构造函数中的数据访问

sql-server - 重新部署包含 CLR 存储过程的 .NET 程序集

c# - 我应该从 SQL CLR 函数中使用 EF6

sql-server-2008 - SQL Server 在线程中触发并运行 CLR 方法