我最近通过以下顺序解决了这个问题。
- 将授予个人登录名/用户的所有权限转换为基于角色的权限(详情如下)。
- 使用与第一个不同的密码创建第二个登录名/用户(按照您的建议);将他们添加到该角色。
- 让您的应用程序转换到第二次登录。
- 确认您在第一次登录时看不到任何登录事件。
- 更改首次登录的密码(如果您希望尽可能小地保持安全范围,则可以完全删除密码)。
至于“创建角色并将权限转移给它”位,这是我使用的脚本:
declare @user sysname = '<your user here>',
@role sysname = '<your role here>';
-- no changes should be necessary below here
select concat('CREATE ROLE ', quotename(@role), ' AUTHORIZATION [dbo];') AS [grant], '' AS [revoke], '' AS [permission_name], NULL AS [class_desc]
union all
select concat('ALTER ROLE ', quotename(@role), ' ADD MEMBER ', QUOTENAME(@user), ';'), '', '', null
UNION all
select concat('GRANT ', permission_name collate database_default, ' ON ',
CASE class_desc
when 'OBJECT_OR_COLUMN' then 'OBJECT::'
when 'TYPE' then 'TYPE::'
END,
QUOTENAME(
CASE class_desc
when 'OBJECT_OR_COLUMN' then OBJECT_SCHEMA_NAME(major_id)
when 'TYPE' then (SELECT SCHEMA_NAME([schema_id]) FROM sys.[types] WHERE [user_type_id] = [major_id])
END), '.',
quotename(
CASE class_desc
when 'OBJECT_OR_COLUMN' then object_name(major_id)
when 'TYPE' then TYPE_NAME(major_id)
END
),
' TO ', QUOTENAME(@role), ';'
),
CONCAT('REVOKE ', permission_name collate database_default, ' ON ',
CASE class_desc
when 'OBJECT_OR_COLUMN' then 'OBJECT::'
when 'TYPE' then 'TYPE::'
END,
QUOTENAME(
CASE class_desc
when 'OBJECT_OR_COLUMN' then OBJECT_SCHEMA_NAME(major_id)
when 'TYPE' then (SELECT SCHEMA_NAME([schema_id]) FROM sys.[types] WHERE [user_type_id] = [major_id])
END), '.',
quotename(
CASE class_desc
when 'OBJECT_OR_COLUMN' then object_name(major_id)
when 'TYPE' then TYPE_NAME(major_id)
END
),
' FROM ', QUOTENAME(@user), ';'
), [permission_name], [class_desc]
from sys.database_permissions
where grantee_principal_id = user_id(@user)
AND [permission_name] <> 'CONNECT'
ORDER BY [permission_name];
就我而言,我只需要担心对象和用户定义的类型权限;如果你有更多,你将不得不考虑他们。但是上面会生成一个四列的结果集。 grant 列将是创建角色的 SQL,将您指定的用户添加到角色中,然后授予角色该用户当前拥有的所有权限。 revoke 列将是从用户那里获取相同权限的 SQL。另外两列只是为了我的理智,因为我正在开发脚本以确保我没有遗漏任何内容。
一旦您运行了上述所有操作(请在投入生产之前在非生产环境中对其进行测试!),您的应用程序将利用该角色获得
它的权限。之后,您应该能够满怀信心地以适合您需求的节奏推进上述计划的其余部分。