2010-06-28 12 views
5

Ho un requisito in SQL Server 2008 nel database di sviluppoCreate Procedure permesso SOLO

  1. Solo di DBA (che sono proprietari di database) in grado di creare, modificare tabelle. Gli sviluppatori non dovrebbero creare o modificare tabelle.
  2. Gli sviluppatori possono creare/modificare le stored procedure/funzioni definite dall'utente nello schema dbo e possono eseguire SP/UDF.
  3. Gli sviluppatori dovrebbero avere SELECT, INSERT, DELETE, UPDATE sulle tabelle ( tabelle in schema dbo

Come raggiungere questo GRANT utilizzando


trovato una soluzione del campione da parte di Google, ma ancora avere problema

CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj 987kj//' 

CREATE USER testdev 

GRANT ALTER ON SCHEMA::dbo TO testdev 
GRANT CREATE PROCEDURE TO testdev 
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO testdev 

CREATE TABLE mysig (a int NOT NULL) 
EXECUTE AS USER = 'testdev' 
go 

CREATE PROCEDURE slaskis AS PRINT 12 
go 

CREATE TABLE hoppsan(a int NOT NULL) -- FAILS! 
go 

INSERT mysig (a) VALUES(123) 
go 

REVERT 
go 

DROP PROCEDURE slaskis 
DROP TABLE mysig 
DROP USER testdev 
DROP LOGIN testdev 

La sintassi di cui sopra in grado di bloccare sviluppatore di creare tavolo, ma non posso blocco sviluppatori di utilizzare SSMS d Esegui e modifica la tabella.

Grazie.

+0

prima di tutto hai gruppi separati per dba e sviluppatori? – hgulyan

+0

Se inserisci codice o XML, ** per favore ** evidenzia queste righe nell'editor di testo e fai clic sul pulsante "codice" (101 010) sulla barra degli strumenti dell'editor per formattarlo in modo appropriato e evidenziare la sintassi! –

+0

hgulyan: sì, ho avuto diversi gruppi di utenti per dba e sviluppatori – mengchew0113

risposta

7

Prima di tutto userei i ruoli invece di concedere l'accesso direttamente agli utenti. Potresti già farlo, ma ho pensato di parlarne.

OK, il problema qui è la concessione di ALTER allo Schema significa che l'utente autorizzato ha accesso ALTER a tutti i tipi di oggetti nello schema. Sfortunatamente, per quanto ne so, non c'è modo di concedere autorizzazioni a tipi di oggetti specifici, quindi è tutto o niente. Viceversa, non è possibile concedere ALTER a tutti gli oggetti e quindi negare ALTER a tipi di oggetto specifici.

L'unico modo che ho trovato di fare questo è di concedere ALTER allo schema e quindi usare un trigger DDL per controllare cosa può fare il ruolo.

Ecco una versione aggiornata del vostro esempio che dimostra il principio:

--** Create a Developer Role 
CREATE ROLE [Developer] AUTHORIZATION db_securityadmin; 
GO 

--** Grant view and execute on all SPs to Devloper 
--GRANT VIEW DEFINITION ON SCHEMA::dbo TO [Developer]; 
GRANT CREATE PROCEDURE TO [Developer]; 
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER, EXECUTE, VIEW DEFINITION ON SCHEMA::dbo TO [Developer] 

--** Create user and login for testdev and add to the Developer role 
CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj987kj' 
CREATE USER testdev 
EXEC sp_addrolemember @rolename = 'Developer', @membername = 'testdev'; 
GO 

--** Create DDL trigger to deny drop and alter to the Developer role 
CREATE TRIGGER tr_db_DenyDropAlterTable_Dev 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
BEGIN 
    IF IS_MEMBER('Developer') = 1 
    BEGIN 
     PRINT 'You are not authorized to alter or drop a table.'; 
     ROLLBACK TRAN; 
    END; 
END; 
GO 

--** Testing 
CREATE TABLE mysig (a int NOT NULL) ; 

EXECUTE AS USER = 'testdev'; 
GO 

CREATE PROCEDURE slaskis AS PRINT 12; 
GO 

CREATE TABLE hoppsan(a int NOT NULL); -- FAILS! 
GO 

INSERT mysig (a) VALUES(123); 
GO 

ALTER TABLE mysig ADD test INT; --** This will fail too 
GO 

REVERT; 
GO 

DROP PROCEDURE slaskis ; 
DROP TABLE mysig ; 
DROP USER testdev; 
DROP LOGIN testdev; 
DROP ROLE [Developer]; 
DROP TRIGGER tr_db_DenyDropAlterTable_Dev on DATABASE; 
+0

Grazie per le soluzioni – mengchew0113

+0

Ho appena scoperto che l'utente è in grado di rinominare il nome della tabella. possiamo bloccare o negare l'utente usando sp_rename? – mengchew0113

+0

Ah sì, sp_rename. Beh, se stai usando SQL Server 2005, non sono sicuro che ci sia molto da fare. Tuttavia, in SQL Server 2008 è stato aggiunto l'evento DDL RENAME, quindi è possibile modificare il trigger DDL per acquisirlo. Quindi il trigger DDL diventa: CREATE TRIGGER tr_db_DenyDropAlterTable_Dev ON DATABASE PER DROP_TABLE, ALTER_TABLE, RENAME COME INIZIALE .... – JonPayne

-1

il seguente codice creerà l'utente e il ruolo in SQL Server 2012:

USE PermissionDB; 
---Select Your database 
CREATE ROLE Employee; 
---Create role 
CREATE USER Employee1 Without Login; 
---Create User 

----Execute the Above query 
EXEC sp_addrolemember @rolename = 'Employee', @membername = 'Employee1'; 

Hope Questa sarebbe utile. ...

+0

Questa non è una risposta.La domanda specificata "Gli sviluppatori non devono creare o modificare tabelle" e l'utente nell'esempio potrebbe fare entrambe le cose. – Thronk

Problemi correlati