为了处理登录名、角色、用户等之间的命名冲突,您应该根据Microsoft sys.database_principals 文档检查 type
列。
为了处理用户名中的特殊字符等,相应地使用 N'<name>'
和 [<name>]
。
创建登录
USE MASTER
IF NOT EXISTS (SELECT 1 FROM master.sys.server_principals WHERE
[name] = N'<loginname>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
CREATE LOGIN [<loginname>] <further parameters>
创建数据库用户
USE [<databasename>]
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE
[name] = N'<username>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
CREATE USER [<username>] FOR LOGIN [<loginname>]
创建数据库角色
USE [<databasename>]
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE
[name] = N'<rolename>' and Type = 'R')
CREATE ROLE [<rolename>]
添加用户到角色
USE [<databasename>]
EXEC sp_addrolemember N'<rolename>', N'<username>'
授予角色权限
USE [<databasename>]
GRANT SELECT ON [<tablename>] TO [<rolename>]
GRANT UPDATE ON [<tablename>] ([<columnname>]) TO [<rolename>]
GRANT EXECUTE ON [<procedurename>] TO [<rolename>]
该SQL已经在SQL Server 2005、2008、2008 R2、2014、2016、2017和2019上进行了测试。