Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cấp quyền cho một thủ tục được lưu trữ

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ấp
grant 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Chọn bản ghi mới nhất khi có bản sao

  2. Làm cách nào để thực hiện thay thế lồng nhau của các giá trị từ một bảng khác?

  3. C # &SQL Server - cách tốt nhất để xóa nhiều Hàng trong một lần sử dụng thủ tục được lưu trữ

  4. Làm thế nào để làm cho CLR này hoạt động với năm 2005?

  5. 5 mẹo hữu ích nhanh cho SQL Server Production DBAs