Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何仅为Microsoft SQL Server中的特定数据库启用CLR集成?_Sql Server_Sqlclr - Fatal编程技术网

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

Sql server 如何仅为Microsoft SQL Server中的特定数据库启用CLR集成?,sql-server,sqlclr,Sql Server,Sqlclr,默认情况下禁用。我对启用它的理解意味着对整个服务器启用或禁用它。是否可以在每个数据库的基础上启用它?如果是,如何启用?启用“CLR集成”是服务器/实例级别的唯一选项;不能对每个数据库单独处理它 但是,虽然我不确定为什么在每个数据库的基础上处理这个问题,但您可以始终在不希望使用自定义SQLCLR代码的数据库中拒绝创建程序集 更新 我刚刚测试了DENY CREATE ASSEMBLY TO[Public]这不适用于属于sysadmin固定服务器角色成员的登录。因此,另一种有效地拒绝对某个操作的权限的

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

启用“CLR集成”是服务器/实例级别的唯一选项;不能对每个数据库单独处理它

但是,虽然我不确定为什么在每个数据库的基础上处理这个问题,但您可以始终在不希望使用自定义SQLCLR代码的数据库中拒绝创建程序集

更新

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

以下是一个DDL触发器,它可以在创建它的任何数据库中工作,并捕获
CREATE ASSEMBLY
ALTER ASSEMBLY
语句,但仍然允许
拖放ASSEMBLY
(使用
DDL\u ASSEMBLY\u EVENTS
,因为事件组将不允许所有三个操作):

使用[db_name];
去
创建触发器[PreventCreateAssembly]
关于数据库
在ALTER_ASSEMBLY之后,创建_ASSEMBLY--DDL_ASSEMBLY_事件
作为
RAISERROR(N'无法创建或更改程序集!',16,1);
回降;
去
有了这个DDL触发器,当我尝试创建程序集时,我现在收到以下错误,即使我的登录名是
sysadmin

Msg 50000,16级,状态1,程序装配,第59行
无法创建或更改程序集
Msg 3609,16级,状态2,第54行
事务在触发器中结束。批处理已中止


不,这是一个实例级选项。没有为特定数据库启用触发器的选项。的可能重复。当然,这不会阻止sysadmin角色的登录禁用触发器,但如果这是您遇到的问题,则您的问题不再是技术问题。@BaconBits True and True。但是,没有办法真正阻止系统管理员做任何事情:打开/关闭“CLR集成”或重新授予
创建程序集
,如果这样做有效的话。我认为这样做的好处是,至少可以防止像自动卷展脚本(作为
sysadmin
运行)这样的事情,如果只拒绝向公众创建程序集,则允许这样做。