2010-06-28 13 views
5

Ich habe eine Verpflichtung in SQL Server 2008 in der Entwicklung DatenbankCreate Procedure Permission NUR

  1. Nur der DBA (die Datenbank Besitzer sind) erstellen können, ändern Tabellen. Entwickler sollten keine Tabellen erstellen oder ändern.
  2. Entwickler können Stored Procedure/User Defined Funktionen in Dbo-Schema erstellen/ändern und SP/UDF ausführen.
  3. Entwickler sollten SELECT, INSERT, DELETE, UPDATE für Tabellen ( Tabellen in dbo Schema

Wie dies mit GRANT-Anweisung


Gefunden eine Probenlösung von Google, zu erreichen, aber immer noch haben Problem

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 

Die obige Syntax in der Lage, Entwickler zu blockieren, um Tabelle zu erstellen, kann aber Entwickler nicht blockieren, um SSMS d zu verwenden Setzen und ändern Sie den Tisch.

Danke.

+0

vor allem haben Sie getrennte Gruppen für dba's und Entwickler? – hgulyan

+0

Wenn Sie Code oder XML schreiben, ** bitte ** markieren Sie diese Zeilen im Texteditor und klicken Sie auf die Schaltfläche "Code" (101 010) auf der Editor-Symbolleiste, um sie schön formatieren und Syntax hervorheben! –

+0

hgulyan: ja, ich hatte andere Benutzergruppe für dba & Entwickler – mengchew0113

Antwort

7

Zuerst würde ich Rollen verwenden, anstatt den Benutzern direkten Zugriff zu gewähren. Vielleicht machst du das schon, aber ich dachte, ich würde es erwähnen.

Okay, das Problem, ALTER dem Schema zu gewähren, bedeutet, dass der Berechtigungsempfänger ALTER-Zugriff auf alle Objekttypen im Schema hat. Soweit ich weiß, gibt es leider keine Möglichkeit, bestimmten Objekttypen Berechtigungen zu erteilen, also alles oder nichts. Umgekehrt können Sie allen Objekten ALTER nicht zuweisen und dann ALTER bestimmten Objekttypen verweigern.

Die einzige Möglichkeit, die ich gefunden habe, ist, dem Schema ALTER zu gewähren und dann einen DDL-Trigger zu verwenden, um zu steuern, was die Rolle tun kann. Hier

ist eine aktualisierte Version Ihres Beispiel demonstriert das Prinzip:

--** 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

Danke für die Lösungen – mengchew0113

+0

Gerade herausgefunden, dass Benutzer in der Lage sind, den Tabellennamen umzubenennen. können wir Benutzer mit sp_rename blockieren oder verweigern? – mengchew0113

+0

Ah ja, sp_rename. Nun, wenn Sie SQL Server 2005 ausführen, bin ich mir nicht sicher, ob Sie viel tun können. In SQL Server 2008 wurde jedoch das DDL-Ereignis RENAME hinzugefügt, sodass Sie Ihren DDL-Trigger ändern können, um ihn zu erfassen. So wird der DDL-Trigger zu: CREATE TRIGGER tr_db_DenyDropAlterTable_Dev ON DATABASE FÜR DROP_TABLE, ALTER_TABLE, RENAME AS BEGIN .... – JonPayne

-1

Der folgende Code wird Erstellen Sie den Benutzer und Rolle 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'; 

Hoffnung Dies wäre hilfreich. ...

+0

Dies ist keine Antwort.Frage angegeben "Entwickler sollten keine Tabellen erstellen oder ändern" und der Benutzer in Ihrem Beispiel könnte beides tun. – Thronk

Verwandte Themen