我正在使用Remus的文章http://rusanu.com/2006/03/07/call-a-procedure-in-another-database-from-an-activated-procedure/作为指南。
我想做的是:
我有一个激活的存储过程(在激活的SP中)调用两个不同的存储过程。其中一个存储过程需要访问另一个数据库中的表来查找某些数据,然后它会在本地使用额外的信息写入记录。由于我正在跨数据库,我的选择是
所以我做了下面的工作,但是它仍然失败,“锁定超时超过了”和“无法访问数据库.在当前的安全环境下。
在数据库服务代理中,运行在:
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'现在,在具有附加表的数据库中:
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作为所有者,但仍然无法工作。
任何帮助都很感激。
发布于 2015-01-07 10:10:11
太长以至于不能发表评论
无法访问数据库..。在当前的安全环境下。
这意味着证书业务设置不正确(我不怪你,第一次尝试就很难做到)。我想看看这些:
EXECUTE AS USER='dbo';。如果失败(这意味着数据库是由不再有效的Windows创建的),则运行ALTER AUTHORIZATION ON DATABASE:<dbname> TO sa。添加EXECUTE作为所有者
该过程必须有一个EXECUTE AS子句,但只要有一个子句,它就不会有多大关系。您正在将SELECT权限授予证书(因此授予签名),因此无论过程模拟谁,它都应该工作。
为了进行调试,我建议您只从SSMS查询窗口手动运行存储的proc:
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调整)。
发布于 2015-01-07 09:26:09
好像是元数据锁。如果在激活过程中执行任何DDL操作,比如创建索引或操作列,则如果激活过程的多个实例处于服务状态,则可以期望锁定超时。请记住,激活过程通常是一个长时间运行的事务,如果它对任何对象都有锁,它会一直锁定到事务结束为止。
https://stackoverflow.com/questions/27807073
复制相似问题