如何为 Microsoft SQL 服务器中的特定数据库启用 CLR 集成?
How to enable CLR integration for just a specific database in Microsoft SQL Server?
CLR integration is disabled by default. My understanding of the instructions 启用它意味着它对整个服务器启用或禁用。是否可以在每个数据库的基础上启用它?如果可以,怎么做?
启用 "CLR Integration" 是 Server/Instance-level 唯一的选项;它不能按数据库单独处理。
然而,虽然我不确定为什么在每个数据库的基础上处理这个问题很重要,但您总是可以 DENY CREATE ASSEMBLY
在您不希望使用自定义 SQLCLR 代码的数据库中。
更新
我刚刚测试了 DENY CREATE ASSEMBLY TO [Public];
,这不适用于 sysadmin
固定服务器角色成员的登录。因此,另一种 有效地 拒绝操作权限的方法是通过 DDL Trigger 捕获操作并发出 ROLLBACK
来取消操作。
以下是一个 DDL 触发器,它可以在创建它的任何数据库中工作并捕获 CREATE ASSEMBLY
和 ALTER 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.
CLR integration is disabled by default. My understanding of the instructions 启用它意味着它对整个服务器启用或禁用。是否可以在每个数据库的基础上启用它?如果可以,怎么做?
启用 "CLR Integration" 是 Server/Instance-level 唯一的选项;它不能按数据库单独处理。
然而,虽然我不确定为什么在每个数据库的基础上处理这个问题很重要,但您总是可以 DENY CREATE ASSEMBLY
在您不希望使用自定义 SQLCLR 代码的数据库中。
更新
我刚刚测试了 DENY CREATE ASSEMBLY TO [Public];
,这不适用于 sysadmin
固定服务器角色成员的登录。因此,另一种 有效地 拒绝操作权限的方法是通过 DDL Trigger 捕获操作并发出 ROLLBACK
来取消操作。
以下是一个 DDL 触发器,它可以在创建它的任何数据库中工作并捕获 CREATE ASSEMBLY
和 ALTER 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.