web-dev-qa-db-fra.com

Créer une autorisation de table pour un utilisateur dans un schéma spécifique

Je veux donner l'autorisation Créer, modifier et supprimer à l'utilisateur A sur un schéma1 d'une base de données. Je suppose que cette question a déjà été posée, et ce que j'ai trouvé est d'accorder une modification au schéma et également d'accorder une table de création à l'utilisateur A: GRANT ALTER, DELETE, EXECUTE, INSERT, SELECT, UPDATE ON SCHEMA::schema1 TO user A;

GRANT CREATE TABLE TO User A;

Si c'est le cas, l'utilisateur A pourra-t-il également créer une table sur d'autres schémas?

4
joeprince

Je veux donner l'autorisation Créer, modifier et supprimer à l'utilisateur A sur un schéma1 d'une base de données

Le moyen sûr de le faire est de faire en sorte que le propriétaire soit propriétaire de ce schéma.

Accorder à un utilisateur la possibilité de modifier le schéma d'un autre utilisateur lui donne la possibilité de sélectionner, d'insérer, de mettre à jour et de supprimer des lignes dans n'importe quelle table appartenant au propriétaire de ce schéma. C'est ce qu'on appelle le "chaînage de propriété" et c'est ce qui rend les vues et les procédures stockées des moyens vraiment simples de contrôler la sécurité, car un utilisateur qui a des autorisations sur une vue ou une procédure stockée n'a pas besoin de se voir accorder des autorisations sur la table sous-jacente, tant que le View/Proc a le même propriétaire que la table.

Cependant, dans ce scénario, vous pouvez facilement créer une faille de sécurité avec les chaînes de propriété. En règle générale, vous ne voulez jamais qu'un utilisateur puisse créer des objets qui appartiendront à un utilisateur différent (et surtout privilégié).

EG, le simple fait d'accorder CREATE TABLE, ALTER et INSERT crée une faille de sécurité:

use master
--drop database security_test
go
create database security_test
go
use security_test 
go

create schema schema1 authorization dbo
go
create user A without login
go
grant create table to A
grant alter, insert on schema::schema1 to A
go
create table dbo.secret(id int, msg varchar(200))
insert into dbo.secret(id,msg) values (1, 'secret data')
go
execute as user='A'

create table schema1.foo(id int)

go
create trigger t on schema1.foo after insert
as
begin
  select * from dbo.secret 
end

go

insert into schema1.foo(id) values (1)


go

revert

les sorties

id          msg
----------- -----
1           secret data

Oui, vous devez accorder l'autorisation de création de table au niveau de la base de données. Si un utilisateur se voit accorder les autorisations nécessaires pour créer une table, par exemple, mais n'a pas les autorisations nécessaires pour le faire dans un schéma particulier, il ne peut pas créer de tablette ici.

3
user103326

Non, si vous ne spécifiez pas le schéma qu'il peut modifier et que vous l'ajoutez simplement GRANT CREATE TABLE TO User A, vous ne pourrez pas créer de table n'importe où.

Vous devez spécifier le schéma qu'il peut modifier afin de rendre l'autorisation CREATE TABLE active. Après tout, l'ajout/la suppression de tables au schéma est considéré comme une modification de schéma et chaque fois que vous effectuez n'importe quel type de DDL, le serveur SQL nécessite un verrou Sch-M qui est essentiellement une modification de schéma.

1
S4V1N