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