У меня есть проект базы данных SQL 2005 в VS2010. У меня есть пользователь, который создается и получает разрешения для базы данных.
Test.user.sql
CREATE USER [$(MachineName)\Test] FOR LOGIN [$(MachineName)\Test] WITH DEFAULT_SCHEMA = dbo;
GO
EXEC sp_addrolemember N'db_datawriter', N'$(MachineName)\Test'
GO
EXEC sp_addrolemember N'db_datareader', N'$(MachineName)\Test'
GO
У меня есть SQLCMDVAR, определенный для $(MachineName)
, который содержит имя машины в зависимости от выбранной конфигурации (Debug (Dev), QA, UAT, Production). Эта переменная корректно устанавливается в верхней части сгенерированного SQL:
:setvar MachineName "TheMachineName"
При развертывании этого проекта пользователь, созданный в приведенном выше сценарии, удаляется и затем воссоздается, а разрешения для пользователя аннулируются. Во время развертывания то, что генерируется в отношении этого пользователя и его разрешений, зависит от состояния пользователя в базе данных.
Если пользователь существует с разрешениями datareader
и datawriter
, эти разрешения отменяются, пользователь удаляется, затем пользователь воссоздается, а разрешения нет. Visual Studio добавляет эту строку, где команды sp_addrolemember
должны быть:
PRINT N'Altering <unnamed>...';
GO
PRINT N'No script could be generated for operation 2 on object ''<unnamed>''.';
GO
PRINT N'Altering <unnamed>...';
GO
PRINT N'No script could be generated for operation 2 on object ''<unnamed>''.';
GO
Если я снова разверну проект, разрешения будут правильно сгенерированы и применены к пользователю:
PRINT N'Creating <unnamed>...';
GO
EXECUTE sp_addrolemember @rolename = N'db_datareader', @membername = N'$(MachineName)\Test';
GO
PRINT N'Creating <unnamed>...';
GO
EXECUTE sp_addrolemember @rolename = N'db_datawriter', @membername = N'$(MachineName)\Test';
GO
Я не могу понять, почему это происходит, какие-либо предложения?