Alguna vez dije que ESO NO SE PODIA, y me callaron la bocota:
Código SQL:
Ver originalBEGIN
DECLARE @SQLString nvarchar(500) = ''
DECLARE @Username VARCHAR(20) = 'nombre_usuario'
DECLARE @password VARCHAR(20) = 'clave'
DECLARE @DBName VARCHAR(20) = 'base_datos'
-- Si no existe el usuario lo doy de alta
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE [name] = @Username)
BEGIN
SET @SQLString = N'create login ' + @Username + ' with password = N'''+ REPLACE(@password, '''', '''''') + ''', DEFAULT_DATABASE=' + QUOTENAME(@DBName) + ', CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'
exe sp_executesql @SQLString
SET @@SQLString = N'use master; GRANT CONNECT SQL TO ' + QUOTENAME(@Username)
exe sp_executesql @SQLString
END
--Deshabilita la posibilidad de ver otra base de datos que no sea master, tempdb o la propia
SET sp_executesql = N'use master; deny VIEW any DATABASE to ' + @Username
exe sp_executesql @SQLString
END
--Agrega el usuario como dbo a la base de datos
SET @SQLString = @DBName + N'.dbo.sp_changedbowner ' + @Username
exe sp_executesql @SQLString