Put all SQL-users (i mean logins) into the sysadmin role.
Alternatively, you need to remap the logins to the users.
EXEC sp_change_users_login 'Auto_Fix', 'user'
where the syntax is this:
EXEC sp_change_users_login 'UserName', 'LoginName'
Here's how I do it:
public override void RemapDbUserLogins(string DbName)
{
string strSQL = @"
USE " + EscapeDbName(DbName) + @";
DECLARE @__DatabasePrincipal sysname --nvarchar(128)
DECLARE @__ServerPrincipal sysname --nvarchar(128)
DECLARE @__CurPrincipals CURSOR
SET @__CurPrincipals = CURSOR FOR
(
-- sysname: nvarchar(128)
-- Get Login for user
SELECT
dp.name AS user_name
--,sp.name AS login_name
,
CASE
WHEN sp.name IS NULL
THEN
CASE
WHEN 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = dp.name COLLATE Latin1_General_CI_AS)
THEN dp.name
WHEN dp.name LIKE '%[_]DE' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 3) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 3)
WHEN dp.name LIKE '%DE' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 2) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 2)
WHEN dp.name LIKE '%[_]EN' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 3) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 3)
WHEN dp.name LIKE '%EN' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 2) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 2)
WHEN dp.name LIKE '%[_]FR' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 3) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 3)
WHEN dp.name LIKE '%FR' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 2) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 2)
WHEN dp.name LIKE '%[_]IT' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 3) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 3)
WHEN dp.name LIKE '%IT' AND 1 = (SELECT COUNT(*) FROM sys.server_principals AS spSubSel WHERE spSubSel.name = SUBSTRING(dp.name, 1, LEN(dp.name) - 2) COLLATE Latin1_General_CI_AS)
THEN SUBSTRING(dp.name, 1, LEN(dp.name) - 2)
--ELSE 'foo' + SUBSTRING(dp.name, 1, LEN(dp.name) - 3)
--ELSE N'ApertureWebServices'
ELSE NULL --COLLATE Latin1_General_CI_AS
END
ELSE sp.name COLLATE Latin1_General_CI_AS
END AS CorrespondingUser
FROM sys.database_principals AS dp
LEFT JOIN sys.server_principals AS sp
ON sp.sid = dp.sid
WHERE dp.type_desc = 'SQL_USER'
AND dp.sid IS NOT NULL
AND dp.sid != 0
AND sp.name IS NULL -- WHERE sids don't match
)
OPEN @__CurPrincipals
FETCH NEXT FROM @__CurPrincipals INTO @__DatabasePrincipal, @__ServerPrincipal
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @__DatabasePrincipal + N' = ' + @__ServerPrincipal
--EXEC sp_helptext 'sp_change_users_login'
DECLARE @Action varchar(10) -- REPORT / UPDATE_ONE / AUTO_FIX
DECLARE @UserNamePattern sysname = NULL
DECLARE @LoginName sysname = NULL
DECLARE @Password sysname = NULL
SET @Action = 'Update_One'
SET @UserNamePattern = @__DatabasePrincipal -- N'ApertureWebServicesDE'
SET @LoginName = @__ServerPrincipal -- N'ApertureWebServices'
IF @LoginName IS NOT NULL
BEGIN
PRINT 'EXECUTE sp_change_users_login @Action = ''' + @Action + N''', @UserNamePattern = ''' + @UserNamePattern + N''', @LoginName = ''' + @LoginName + N''', @Password = ' + ISNULL(N'''' + @Password + N'''', N'NULL')
EXECUTE sp_change_users_login @Action, @UserNamePattern, @LoginName, @Password
END
ELSE
BEGIN
PRINT N'Ignored user ' + @UserNamePattern
END
FETCH NEXT FROM @__CurPrincipals INTO @__DatabasePrincipal, @__ServerPrincipal
END
CLOSE @__CurPrincipals
DEALLOCATE @__CurPrincipals
";
ExecuteWithoutTransaction(strSQL);
} // End Sub RemapDbUserLogins