首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Service跨数据库选择插入本地DB?

Service跨数据库选择插入本地DB?
EN

Stack Overflow用户
提问于 2015-01-06 20:59:07
回答 2查看 1.2K关注 0票数 2

我正在使用Remus的文章http://rusanu.com/2006/03/07/call-a-procedure-in-another-database-from-an-activated-procedure/作为指南。

我想做的是:

我有一个激活的存储过程(在激活的SP中)调用两个不同的存储过程。其中一个存储过程需要访问另一个数据库中的表来查找某些数据,然后它会在本地使用额外的信息写入记录。由于我正在跨数据库,我的选择是

  • “值得信赖”(通过,谢谢)
  • “将查找表复制到同一个数据库服务代理中”
  • “使证书工作”(此方法)

所以我做了下面的工作,但是它仍然失败,“锁定超时超过了”和“无法访问数据库.在当前的安全环境下。

在数据库服务代理中,运行在:

代码语言:javascript
复制
USE database_with_service_broker_and_queue
GO
CREATE CERTIFICATE mysp_Auditing ENCRYPTION 
    BY PASSWORD = '123457' 
    with subject = 'god_i_hope_this_works'
ADD SIGNATURE TO OBJECT::myschema.mystoredprocedure 
    BY CERTIFICATE mysp_Auditing 
    WITH PASSWORD = '123457'
ALTER CERTIFICATE mysp_Auditing REMOVE PRIVATE KEY
BACKUP CERTIFICATE mysp_Auditing to file = 'c:\mysp_auditing.CER'

现在,在具有附加表的数据库中:

代码语言:javascript
复制
USE db_with_tables_I_need
GO
CREATE CERTIFICATE mysp_Auditing from file = 'c:\mysp_auditing.CER'
CREATE USER mysp_Auditing FROM CERTIFICATE mysp_Auditing
GRANT AUTHENTICATE to mysp_Auditing
GRANT SELECT ON TABLE1 to mysp_Auditing
GRANT SELECT on TABLE2 to mysp_Auditing

然后启用队列并查看所有错误消息。我甚至尝试更改存储过程以添加EXECUTE作为所有者,但仍然无法工作。

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-07 10:10:11

太长以至于不能发表评论

无法访问数据库..。在当前的安全环境下。

这意味着证书业务设置不正确(我不怪你,第一次尝试就很难做到)。我想看看这些:

  • 确保'dbo‘是一个有效的用户。尝试在所涉及的两个DB上运行EXECUTE AS USER='dbo';。如果失败(这意味着数据库是由不再有效的Windows创建的),则运行ALTER AUTHORIZATION ON DATABASE:<dbname> TO sa
  • 在签完名后,请确保不更改程序。任何更改都会悄悄地删除签名并使您的信任链失效。

添加EXECUTE作为所有者

该过程必须有一个EXECUTE AS子句,但只要有一个子句,它就不会有多大关系。您正在将SELECT权限授予证书(因此授予签名),因此无论过程模拟谁,它都应该工作。

为了进行调试,我建议您只从SSMS查询窗口手动运行存储的proc:

代码语言:javascript
复制
 USE myactivateddb;
 GO

 EXECUTE AS USER='dbo'; -- does not matter who, is important to be AS USER
 GO

 EXEC myotherdb.dbo.myotherproc ...;
 GO

 REVERT;
 GO

这是比较容易调试的尝试从激活的过程。如果这样做有效,那么尝试同样的方法,但不要执行其他存储的proc,而是从SSMS查询窗口执行激活过程(在队列上的激活时进行w/o调整)。

票数 2
EN

Stack Overflow用户

发布于 2015-01-07 09:26:09

好像是元数据锁。如果在激活过程中执行任何DDL操作,比如创建索引或操作列,则如果激活过程的多个实例处于服务状态,则可以期望锁定超时。请记住,激活过程通常是一个长时间运行的事务,如果它对任何对象都有锁,它会一直锁定到事务结束为止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27807073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档