如何为MDS Excel插件关联用户授予跨数据库存储过程执行权限?
解决MDS Excel插件发布时触发器跨库存储过程权限问题
问题分析
错误中的SID S-1-9-3-4000979447-1289397781-4196995230-646085745 属于SQL Server数据库级主体(无服务器登录),大概率是MDS执行Excel插件操作时使用的内部应用程序角色或专用数据库用户。这类用户无法直接授予跨数据库权限,需通过证书签名存储过程实现安全的跨库权限传递。
解决方案:证书签名存储过程(推荐,符合权限最小化原则)
步骤1:定位SID对应的数据库主体
在MDS数据库中执行以下查询,找到该SID对应的用户/角色名称:
USE [你的MDS数据库名]; SELECT name, type_desc FROM sys.database_principals WHERE sid = CONVERT(varbinary(MAX), 'S-1-9-3-4000979447-1289397781-4196995230-646085745', 1);
步骤2:在MDS数据库创建证书并签名存储过程
假设你已在MDS数据库中创建了用于调用跨库存储过程的本地存储过程(如dbo.ExecuteWhenTriggered),执行以下操作:
- 创建证书:
USE [你的MDS数据库名]; CREATE CERTIFICATE [MDS_CrossDB_Cert] ENCRYPTION BY PASSWORD = 'YourStrongPassword123!' WITH SUBJECT = '用于跨数据库存储过程调用的证书', EXPIRY_DATE = '2030-12-31';
- 导出证书到本地安全路径:
BACKUP CERTIFICATE [MDS_CrossDB_Cert] TO FILE = 'C:\SafePath\MDS_CrossDB_Cert.cer' WITH PRIVATE KEY ( FILE = 'C:\SafePath\MDS_CrossDB_Cert.pvk', ENCRYPTION BY PASSWORD = 'YourStrongPassword123!', DECRYPTION BY PASSWORD = 'YourStrongPassword123!' );
- 用证书签名本地存储过程,并确保MDS操作主体有执行权限:
USE [你的MDS数据库名]; ADD SIGNATURE TO [dbo.ExecuteWhenTriggered] BY CERTIFICATE [MDS_CrossDB_Cert] WITH PASSWORD = 'YourStrongPassword123!'; -- 为MDS操作主体(如mds_schema_user或步骤1找到的用户)授予存储过程执行权限 GRANT EXECUTE ON [dbo.ExecuteWhenTriggered] TO [mds_schema_user];
步骤3:在目标数据库导入证书并授予权限
在IHS-Dataplatform数据库中执行以下操作:
- 导入证书:
USE [IHS-Dataplatform]; CREATE CERTIFICATE [MDS_CrossDB_Cert] FROM FILE = 'C:\SafePath\MDS_CrossDB_Cert.cer' WITH PRIVATE KEY ( FILE = 'C:\SafePath\MDS_CrossDB_Cert.pvk', DECRYPTION BY PASSWORD = 'YourStrongPassword123!', ENCRYPTION BY PASSWORD = 'YourStrongPassword123!' );
- 创建证书对应的用户并授予目标存储过程执行权限:
USE [IHS-Dataplatform]; CREATE USER [MDS_CrossDB_User] FROM CERTIFICATE [MDS_CrossDB_Cert]; GRANT EXECUTE ON [dbo.目标存储过程名] TO [MDS_CrossDB_User];
步骤4:验证功能
修改触发器,让它调用签名后的本地存储过程,再通过MDS Excel插件执行Publish操作,验证权限错误是否消失。
替代方案:应用程序角色激活(不推荐,安全性较低)
若步骤1中查到的主体是应用程序角色,可在触发器中激活该角色后执行跨库调用:
USE [你的MDS数据库名]; ALTER TRIGGER [你的触发器名] ON [你的MDS表名] AFTER INSERT, UPDATE, DELETE AS BEGIN DECLARE @cookie varbinary(8000); -- 激活应用程序角色 EXEC sp_setapprole @rolename = '找到的应用程序角色名', @password = '角色密码', @fCreateCookie = true, @cookie = @cookie OUTPUT; -- 调用跨库存储过程 EXEC [IHS-Dataplatform].[dbo].[目标存储过程名]; -- 关闭应用程序角色 EXEC sp_unsetapprole @cookie = @cookie; END
此方案需存储应用程序角色密码,存在安全风险,仅作为证书签名无法实施时的临时替代。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

