No se como solucionar esta asignación de permisos

03/02/2009 - 18:43 por sergio.leon.leon | Informe spam
Hola:

Tengo un problema que no se como solucionar y me está volviendo un
poco loco.
Estoy trabajando con SQL Server 2005.
Necesio crear un login que tenga permiso para crear bases de datos
pero que no pueda manipular bases de datos que él no haya creado,
aunque si debe poder leer su contenido.
He probado varias soluciones:
1. Crear el login y asignarle la función fija de servidor dbcreator.
Con esto puede crear bases de datos sin problemas. Después y mediante
un cursor recorro todas las base de datos y las que ha creado el
login, le meto como un usuario miembro del esquema db_datareader (con
esto puede leer las base de datos que no son suyas).
Hasta aquí todo OK, pero el problema está en que aunque no puede
borrar, insertar datos en las tablas, etc... SI que puede borrar y
cambiar el nombre a la bases de datos que NO son suyas.
Para intentar solucionar esto le he revocado (primero) y denegado
(segundo) el permiso ALTER ANY DATABASE, pero no me va...

Estoy a un 90% de la solución, pero ese paso final de como impedir
que borre o renombre bases de datos que él no ha creado, no soy capaz
de conseguirlo.

Os dejo el script por si ayuda en algo.

DECLARE @dbName NVARCHAR(250)
DECLARE @SQL NVARCHAR(4000)

DECLARE curDatabases CURSOR FOR
SELECT Name FROM SYS.DATABASES WHERE UPPER(NAME) NOT IN
('MODEL','TEMPDB','MASTER','MSDB')
OPEN curDatabases

FETCH NEXT FROM curDatabases INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'USE ' + @dbName + char(10) + char(13)
SET @SQL = @SQL + ' IF NOT EXISTS (SELECT * FROM
sys.database_principals WHERE name = N''vlancuza'')' + char(10) + char
(13)
SET @SQL = @SQL + ' CREATE USER [vlancuza] FOR LOGIN [vlancuza] ' +
char(10) + char(13)
SET @SQL = @SQL + ' EXEC sp_addrolemember N''db_datareader'',
N''vlancuza''' + char(10) + char(13)
SET @SQL = @SQL + ' ALTER USER [vlancuza] WITH DEFAULT_SCHEMA[db_datareader]' + char(10) + char(13)
EXEC(@SQL)

FETCH NEXT FROM curDatabases INTO @dbName
END

CLOSE curDatabases
DEALLOCATE curDatabases

USE [master]
GO
DENY ALTER ANY DATABASE TO [vlancuza]
GO

Gracias y un saludo.
 

Leer las respuestas

#1 Rubén Garrigós
03/02/2009 - 19:27 | Informe spam
Hola Sergio,

Cuando asignas tu usuario como dbcreator estás concediendo un rol que puede
crear, modificar y borrar bases de datos. Lo que puedes hacer es que en vez
de añadirlo a dicho rol, símplemente dale permisos de crear bases de datos
con:

GRANT CREATE ANY DATABASE TO vlancuza

Rubén Garrigós

Solid Quality Mentors

wrote in message
news:
Hola:

Tengo un problema que no se como solucionar y me está volviendo un
poco loco.
Estoy trabajando con SQL Server 2005.
Necesio crear un login que tenga permiso para crear bases de datos
pero que no pueda manipular bases de datos que él no haya creado,
aunque si debe poder leer su contenido.
He probado varias soluciones:
1. Crear el login y asignarle la función fija de servidor dbcreator.
Con esto puede crear bases de datos sin problemas. Después y mediante
un cursor recorro todas las base de datos y las que ha creado el
login, le meto como un usuario miembro del esquema db_datareader (con
esto puede leer las base de datos que no son suyas).
Hasta aquí todo OK, pero el problema está en que aunque no puede
borrar, insertar datos en las tablas, etc... SI que puede borrar y
cambiar el nombre a la bases de datos que NO son suyas.
Para intentar solucionar esto le he revocado (primero) y denegado
(segundo) el permiso ALTER ANY DATABASE, pero no me va...

Estoy a un 90% de la solución, pero ese paso final de como impedir
que borre o renombre bases de datos que él no ha creado, no soy capaz
de conseguirlo.

Os dejo el script por si ayuda en algo.

DECLARE @dbName NVARCHAR(250)
DECLARE @SQL NVARCHAR(4000)

DECLARE curDatabases CURSOR FOR
SELECT Name FROM SYS.DATABASES WHERE UPPER(NAME) NOT IN
('MODEL','TEMPDB','MASTER','MSDB')
OPEN curDatabases

FETCH NEXT FROM curDatabases INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'USE ' + @dbName + char(10) + char(13)
SET @SQL = @SQL + ' IF NOT EXISTS (SELECT * FROM
sys.database_principals WHERE name = N''vlancuza'')' + char(10) + char
(13)
SET @SQL = @SQL + ' CREATE USER [vlancuza] FOR LOGIN [vlancuza] ' +
char(10) + char(13)
SET @SQL = @SQL + ' EXEC sp_addrolemember N''db_datareader'',
N''vlancuza''' + char(10) + char(13)
SET @SQL = @SQL + ' ALTER USER [vlancuza] WITH DEFAULT_SCHEMA[db_datareader]' + char(10) + char(13)
EXEC(@SQL)

FETCH NEXT FROM curDatabases INTO @dbName
END

CLOSE curDatabases
DEALLOCATE curDatabases

USE [master]
GO
DENY ALTER ANY DATABASE TO [vlancuza]
GO

Gracias y un saludo.

Preguntas similares