Scripting de objetos del servidor en un proyecto de base de datos Visual Studio 2010
-
28-10-2019 - |
Pregunta
¿Es el script previo a la implementación (script.predeployment.sql) el mejor lugar para poner comandos SQL que crean objetos de nivel de servidor (específicamente inicios de sesión en mi caso)?
Necesito crear inicios de sesión del servidor para los usuarios de la base de datos en el proyecto y este parece que el único lugar vagamente lógico para ponerlos como todo lo demás en la estructura del proyecto (creado desde la inversión de nuestro Dev DB) es específica de la base de datos. Por lo tanto, solo quería verificar dónde almacenan otros comandos de nivel de servidor cuando trabajan con proyectos de base de datos de Visual Studio.
Muchas gracias.
Solución
Cualquier cosa que necesite antes de implementar su base de datos estaría en ese script.
En nuestro caso, agregamos inicios de sesión en el script posterior a la implementación. No son necesarios cuando implementamos la base de datos, y decidimos poner todos los comandos relacionados con la seguridad en el mismo lugar.
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'$(DefaultLogin)')
BEGIN
BEGIN TRY
CREATE LOGIN [$(DefaultLogin)] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
END TRY
BEGIN CATCH
-- A try-catch is needed in case a user with a different name is created for the LOGIN specified.
END CATCH
END
GO
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'$(DefaultLogin)')
BEGIN
BEGIN TRY
CREATE USER [$(DefaultLogin)] FOR LOGIN [$(DefaultLogin)] WITH DEFAULT_SCHEMA=[dbo]
-- The db_owner role is added to the current database.
EXEC sp_addrolemember N'db_owner', N'$(DefaultLogin)'
END TRY
BEGIN CATCH
-- A try-catch is needed in case a user with a different name is created for the LOGIN specified.
END CATCH
END
Aquí es la referencia previa y posterior a la implementación.