その別のデータベースに読み取り/書き込み権なしで、別のデータベースからSELECTでの手順を実行します

StackMark:

私は、スキーマ上で実行して役割を持っている、と彼は(そのスキーマの下)を参照するすべての手順を実行することができるはずのユーザーが、これらの手順は、ユーザーが見ることができないことを別のデータベースからテーブル/ビューを使用しています。

ここでは解決策を働いている が、すべてのコンポーネント(表および手順)が同じデータベース内にある場合にのみ、およびクエリで、このリンクから私は、任意のユーザー/ロールのアクセスが拒否されていないことを知っています:

たぶん私が使用するいくつかの役割の設定はありますか?以下は私が達成したいものの基本的な例があります:

USE [master];
GO
CREATE DATABASE [temporary1];
CREATE DATABASE [temporary2];
CREATE LOGIN [hero1] WITH PASSWORD = 'batman', CHECK_POLICY = OFF;

---------------

USE [temporary1];
GO
CREATE USER [hero1] FROM LOGIN [hero1];
CREATE TABLE [dbo].[test_table] ([id] INT);
INSERT [dbo].[test_table] VALUES(1);

---------------

USE [temporary2];
GO
CREATE USER [hero1] FROM LOGIN [hero1];

---------------

CREATE PROCEDURE [dbo].[inter_database_secret]
AS
BEGIN
    SELECT [id] FROM [temporary1].[dbo].[test_table];
END

---------------

GRANT EXECUTE ON [temporary2].[dbo].[inter_database_secret] TO [hero1]

---------------

EXECUTE AS USER = 'hero1';
GO
EXECUTE [temporary2].[dbo].[inter_database_secret];  --<---- Sad Error Here
REVERT;

---------------

USE [master];
GO
DROP DATABASE [temporary1];
DROP DATABASE [temporary2];
DROP LOGIN [hero1];
デイビット・ブラウン - マイクロソフト:

ほとんどが。二つの小さな問題。まず、あなたがする必要があります明示的に設定し、クロスデータベースの組み合わせ所有権これは、デフォルトではオフです。第二に、あなたが偽装hero1のログインではなく、データベース・ユーザーに持っているということです。hero1データベースプリンシパル(ユーザー)は、他のデータベースにアクセスすることはできません。hero1サーバープリンシパル(ログイン)がありません。そう

USE [master];
GO
CREATE DATABASE [temporary1];
CREATE DATABASE [temporary2];
CREATE LOGIN [hero1] WITH PASSWORD = 'batman', CHECK_POLICY = OFF;

ALTER DATABASE [temporary1] SET DB_CHAINING ON;  
ALTER DATABASE [temporary2] SET DB_CHAINING ON;  
go

USE [temporary1];
GO
CREATE USER [hero1] FROM LOGIN [hero1];
CREATE TABLE [dbo].[test_table] ([id] INT);
INSERT [dbo].[test_table] VALUES(1);

---------------

USE [temporary2];
GO
CREATE USER [hero1] FROM LOGIN [hero1];

go

CREATE PROCEDURE [dbo].[inter_database_secret]
AS
BEGIN
    SELECT [id] FROM [temporary1].[dbo].[test_table];
END

go

GRANT EXECUTE ON [temporary2].[dbo].[inter_database_secret] TO [hero1]

go
use [temporary2]
go
EXECUTE AS login = 'hero1';
  EXECUTE [dbo].[inter_database_secret];  --<---- Happy Result Here
REVERT;

go

USE [master];
GO
DROP DATABASE [temporary1];
DROP DATABASE [temporary2];
DROP LOGIN [hero1];

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=384235&siteId=1