MSSQL只读数据库加载CLR程序集遇权限问题求助
解决只读MSSQL数据库中.NET程序集加载失败的问题
临时快速方案:短暂切换读写模式开启TRUSTWORTHY
如果能协调出短暂的停机窗口,这是最快的解决路径:
- 先将数据库切换为读写模式(会立即回滚未提交事务,需提前通知业务方):
ALTER DATABASE [dbase] SET READ_WRITE WITH ROLLBACK IMMEDIATE; - 开启TRUSTWORTHY属性:
ALTER DATABASE [dbase] SET TRUSTWORTHY ON; - 恢复只读模式:
ALTER DATABASE [dbase] SET READ_ONLY WITH ROLLBACK IMMEDIATE;
推荐安全方案:用证书签名替代TRUSTWORTHY
微软官方不推荐依赖TRUSTWORTHY属性,建议通过证书签名程序集获取外部访问权限,步骤如下:
- 在
master数据库创建签名证书:CREATE CERTIFICATE AssemblySigningCert ENCRYPTION BY PASSWORD = 'YourStrongPassword123!' WITH SUBJECT = 'Signing cert for external access assemblies'; - 导出证书到本地安全路径:
BACKUP CERTIFICATE AssemblySigningCert TO FILE = 'C:\SafeDir\AssemblySigningCert.cer'; - 临时切换目标数据库为读写模式,导入证书:
ALTER DATABASE [dbase] SET READ_WRITE WITH ROLLBACK IMMEDIATE; CREATE CERTIFICATE AssemblySigningCert FROM FILE = 'C:\SafeDir\AssemblySigningCert.cer'; - 用证书签名目标程序集:
ADD SIGNATURE TO ASSEMBLY::[YourAssemblyName] BY CERTIFICATE AssemblySigningCert WITH PASSWORD = 'YourStrongPassword123!'; - 在
master数据库创建对应登录名并授予权限:CREATE LOGIN AssemblySigningLogin FROM CERTIFICATE AssemblySigningCert; GRANT EXTERNAL ACCESS ASSEMBLY TO AssemblySigningLogin; - 恢复目标数据库为只读模式:
ALTER DATABASE [dbase] SET READ_ONLY WITH ROLLBACK IMMEDIATE;
前置必查:确认程序集权限配置
先排查程序集本身的权限设置是否合规:
- 执行查询查看当前权限:
SELECT name, permission_set_desc FROM sys.assemblies WHERE assembly_id = 65547; - 如果权限不是
EXTERNAL_ACCESS或UNSAFE,需临时切换数据库为读写模式后修改:ALTER ASSEMBLY [YourAssemblyName] WITH PERMISSION_SET = EXTERNAL_ACCESS;
内容的提问来源于stack exchange,提问作者Mishkin
相关产品推荐
相关产品推荐

