Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Berikan izin ke prosedur tersimpan

Yang Anda butuhkan adalah menandatangani prosedurnya.

Izinkan saya meminjam pengaturan dari tautan yang disediakan M.Ali dalam komentarnya (Izin Pengguna SQL Server pada Prosedur Tersimpan dan Tabel Dasar ):

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

Ini adalah pengaturannya, thx to Andomar.

Kami dapat memberikan izin eksekusi kepada UserC pada prosedur:

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

Ini tidak cukup baik. Yang dapat kita lakukan adalah membuat sertifikat dalam database, pengguna database pada sertifikat ini, memberikan izin yang sesuai kepada pengguna tersebut (peran db_owner dalam contoh ini), lalu menandatangani prosedur dengan sertifikat:

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

Ini harus bekerja OK sekarang.

Poin yang harus diperhatikan:pengguna yang dibuat pada sertifikat tidak dapat digunakan sebagai pengguna biasa, tidak ada login dengannya dan ini bukan masalah keamanan; semua izin yang kami berikan kepada pengguna itu akan ditambahkan ke konteks di mana prosedur dijalankan saat kami menambahkan tanda tangan; Jika kita mengubah prosedur, kita harus menandatanganinya lagi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlDataReader.HasRows mengembalikan false sejak pemutakhiran SQL 2008

  2. Bagaimana cara menggabungkan dua pernyataan SQL ini?

  3. Jangan Gunakan sys.sql_dependencies di SQL Server (Sudah Usang)

  4. TSQL - Apakah mungkin untuk menentukan urutan pengurutan?

  5. Bagaimana cara mengambil catatan selama 30 menit terakhir di MS SQL?