Những gì bạn cần là ký vào thủ tục.
Cho tôi mượn thiết lập từ liên kết mà M.Ali cung cấp trong nhận xét của anh ấy ( Quyền của người dùng SQL Server trên các bảng cơ sở và quy trình được lưu trữ ):
use Test
go
if exists (select * from sys.syslogins where name = 'UserA')
drop login UserA
create login UserA with password = 'Welcome'
if exists (select * from sys.syslogins where name = 'UserB')
drop login UserB
create login UserB with password = 'Welcome'
if exists (select * from sys.syslogins where name = 'UserC')
drop login UserC
create login UserC with password = 'Welcome'
if exists (select * from sys.tables where name = 'Customers' and schema_name(schema_id) = 'SchemaA')
drop table SchemaA.Customers
if exists (select * from sys.schemas where name = 'SchemaA')
drop schema SchemaA
if exists (select * from sys.sysusers where name = 'UserA')
drop user UserA
if exists (select * from sys.tables where name = 'Orders' and schema_name(schema_id) = 'SchemaB')
drop table SchemaB.Orders
if exists (select * from sys.procedures where name = 'GetCustomerOrderInfo' and schema_name(schema_id) = 'SchemaB')
drop procedure SchemaB.GetCustomerOrderInfo
if exists (select * from sys.schemas where name = 'SchemaB')
drop schema SchemaB
if exists (select * from sys.sysusers where name = 'UserB')
drop user UserB
if exists (select * from sys.sysusers where name = 'UserC')
drop user UserC
create user UserA for login UserA
alter role db_owner add member UserA
go
create schema SchemaA authorization UserA
go
create user UserB for login UserB
alter role db_owner add member UserB
go
create schema SchemaB authorization UserB
go
create user UserC for login UserC
create table SchemaA.Customers (id int identity)
create table SchemaB.Orders (id int identity, CustomerId int)
go
create procedure SchemaB.GetCustomerOrderInfo
as
select *
from SchemaB.Orders o
join SchemaA.Customers c
on c.id = o.CustomerId
go
Đây là thiết lập, thx cho Andomar.
Chúng tôi có thể cấp cho UserC quyền thực thi quy trình:
Cấpgrant execute on SchemaB.GetCustomerOrderInfo to UserC
execute as login = 'UserC'
exec SchemaB.GetCustomerOrderInfo
-- The SELECT permission was denied on the object 'Customers', database 'Test', schema 'SchemaA'.
revert
Điều này không đủ tốt. Những gì chúng ta có thể làm là tạo chứng chỉ trong cơ sở dữ liệu, người dùng cơ sở dữ liệu trên chứng chỉ này, cấp cho người dùng đó các quyền thích hợp (vai trò db_owner trong mẫu này), sau đó ký thủ tục với chứng chỉ:
create certificate cert_raiser
encryption by password = 'pGFD4bb925DGvbd2439587y'
with subject = 'raiser',
expiry_date = '01/01/2114';
go
create user cert_user from certificate cert_raiser
go
alter role db_owner add member cert_user
go
add signature to SchemaB.GetCustomerOrderInfo
by certificate cert_raiser
with password = 'pGFD4bb925DGvbd2439587y';
go
Nó sẽ hoạt động tốt ngay bây giờ.
Các điểm cần thực hiện:người dùng được tạo trên chứng chỉ không thể được sử dụng như một người dùng bình thường, không có thông tin đăng nhập với nó và đó không phải là vấn đề bảo mật; tất cả các quyền mà chúng tôi cấp cho người dùng đó sẽ được thêm vào ngữ cảnh mà thủ tục được thực thi khi chúng tôi thêm chữ ký; Nếu chúng tôi thay đổi thủ tục, chúng tôi phải ký lại.