sql >> Database >  >> RDS >> Sqlserver

Machtigingen geven aan een opgeslagen procedure

Wat je nodig hebt is om de procedure te ondertekenen.

Laat me de setup lenen van de link die M.Ali heeft gegeven in zijn opmerking (SQL Server-gebruikersmachtigingen voor opgeslagen procedures en onderliggende tabellen ):

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

Dit was de opzet, bedankt voor Andomar.

We kunnen de UserC toestemming geven om de procedure uit te voeren:

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

Dit was niet goed genoeg. Wat we kunnen doen is een certificaat in de database maken, een databasegebruiker op dit certificaat, die gebruiker de juiste machtigingen geven (de rol db_owner in dit voorbeeld) en vervolgens de procedure ondertekenen met het certificaat:

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

Het zou nu goed moeten werken.

Aandachtspunten:de gebruiker die op het certificaat is aangemaakt kan niet als normale gebruiker worden gebruikt, er is geen login mee en het is geen beveiligingsprobleem; alle machtigingen die we die gebruiker geven, worden toegevoegd aan de context waarin de procedure wordt uitgevoerd wanneer we een handtekening toevoegen; Als we de procedure wijzigen, moeten we deze opnieuw ondertekenen.




  1. mysql-ondersteuning in php 7

  2. Tabellen en kolommen neerzetten met SQL

  3. SQL Server meldt 'Ongeldige kolomnaam', maar de kolom is aanwezig en de query werkt via beheerstudio

  4. Dynamisch construeren van MySQL-code voor het maken van een trigger