用sql server自帶的消息隊列service borker,調用存儲過程中,執行了一個跨庫的操作,先是用了一個用戶,權限什么都給夠了,但是一直提示 服務器主體 "user" 無法在當前安全上下文下訪問數據庫 "dbname"。
想着是架構方面的問題,換sa還是不行。查到微軟的一篇文章 提示需要開數據庫的 ALTER DATABASE current_db SET TRUSTWORTHY ON
我把跨的那個庫設置了還是不行。最后自己寫測試代碼,代碼如下:
create database test1 create database test2 use test2 create table t_1 (id int ,ddate date ) insert into t_1 (id,ddate) values(1,GETDATE()) use test1 create proc p_test WITH EXECUTE AS OWNER as begin select GETDATE() select * from test2..t_1 end exec p_test ALTER DATABASE test1 SET TRUSTWORTHY on ALTER DATABASE test2 SET TRUSTWORTHY ON
兩個庫都 SET TRUSTWORTHY on 卻可以了。。。。。。折騰了一天時間。。。。。。。。。。
EXECUTE AS OWNER 設置會話的執行上下文。隊列里去不掉,要解決有兩個方法 ,上面是方法其一,其二是用證書。。。。。。。
查看看到哪些數據庫開了trustworthy屬性,命令如下:
SELECT name, database_id, is_trustworthy_on FROM sys.databases
授權用戶訪問,命令如下:
ALTER AUTHORIZATION ON DATABASE::數據庫名 TO [用戶名]