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];