2010-06-28 12 views
5

que tiene un requisito de SQL Server 2008 en la base de datos de desarrollopermiso Crear procedimiento sólo

  1. Sólo DBA (que son los propietarios de bases de datos) puede crear, modificar tablas. El desarrollador no debe crear o modificar tablas.
  2. desarrolladores pueden crear/alteran Procedimiento almacenado funciones/definidas por el usuario en el esquema dbo y pueden ejecutar SP/UDF.
  3. Los desarrolladores deben tener SELECT, INSERT, DELETE, UPDATE en tablas ( tablas en el esquema dbo

cómo lograr este comando GRANT usando


encontrado una solución de muestra de Google, pero aún tiene 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 sintaxis anterior es capaz de bloquear el desarrollador para crear una tabla pero no puede bloquear el desarrollador para usar SSMS d diseñar y alterar la tabla.

Gracias.

+0

en primer lugar ¿Tiene separados por grupos de DBA y desarrolladores? – hgulyan

+0

Si publica código o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y sintaxis y resaltarlo. –

+0

hgulyan: Sí, lo hice tienen diferentes grupos de usuarios para DBA y desarrolladores – mengchew0113

Respuesta

7

En primer lugar me gustaría utilizar roles en lugar de conceder el acceso directamente a los usuarios. Puede que ya estés haciendo esto, pero pensé que lo mencionaría.

bien, el problema aquí es la concesión de ALTER para el esquema significa que el concesionario tiene ALTER acceso a todos los tipos de objetos en el esquema. Desafortunadamente, hasta donde yo sé, no hay forma de otorgar permisos a tipos de objetos específicos para que sea todo o nada. Por el contrario, no puede otorgar ALTER a todos los objetos y luego negar ALTER a tipos de objetos específicos.

La única manera que he encontrado para hacer esto es la concesión de ALTER en el esquema y luego utilizaron un desencadenador DDL para controlar lo que el papel puede hacer.

Aquí es una versión actualizada de su ejemplo que demuestra el 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

Gracias para las soluciones – mengchew0113

+0

acabo de enterar que el usuario es capaz de cambiar el nombre del nombre de la tabla. ¿podemos bloquear o denegar el usuario utilizando sp_rename? – mengchew0113

+0

Ah sí, sp_rename. Bueno, si está ejecutando SQL Server 2005, no estoy seguro de que haya mucho que pueda hacer. Sin embargo, en SQL Server 2008 agregaron el evento RENAME DDL, por lo que puede cambiar su desencadenador DDL para capturarlo. Entonces, el desencadenador DDL se convierte en: CREATE TRIGGER tr_db_DenyDropAlterTable_Dev EN BASE DE DATOS PARA DROP_TABLE, ALTER_TABLE, RENAME COMO COMIENZO .... – JonPayne

-1

el siguiente código creará el usuario y su papel en 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 Esta sería útil. ...

+0

Esto no es una respuesta.La pregunta especificada "Desarrolladores no debe crear ni alterar tablas" y el usuario en su ejemplo podría hacerlo. – Thronk

Cuestiones relacionadas