如何计算新登录的SID?

时间:2019-06-26 10:56:30

标签: sql-server authentication

我想在两个sql服务器实例上创建许多数据库用户。为了能够轻松地将数据库从一个实例复制到另一个实例,我希望SID保持一致。

我的想法是使用可预测的SID,以最大程度地减少维护麻烦。我梦到这样的事情:

CREATE LOGIN newuser1 WITH PASSWORD = '...', SID = CAST('newuser1' AS BINARY(16))

-- or alternatively:
CREATE LOGIN newuser1 WITH PASSWORD = '...', SID = HASHBYTES('newuser1')

但是,CREATE LOGIN命令似乎不支持计算SID的值:

Meldung 102, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe von "SID". -- Wrong syntax near "SID"

如何为SID使用计算值?

1 个答案:

答案 0 :(得分:1)

这可以通过将sql语句组装到变量中并用sp_executesql执行来实现:

DECLARE @SQL nvarchar(4000)

SET @SQL = 'CREATE LOGIN newuser1 WITH PASSWORD = ''...'', SID = 0x'+CONVERT(VARCHAR(1000), CAST('newuser1' AS binary(16)), 2)
PRINT @SQL
EXEC sp_executesql @SQL

或者,如果您想重用这种方法,则可以使用创建存储过程:

CREATE PROCEDURE create_user_with_predictable_sid
    @UserName varchar(256),
    @Password varchar(256)
AS
DECLARE @SQL nvarchar(4000) = 'CREATE LOGIN '+@UserName+' WITH PASSWORD = '''+@Password+''', SID = 0x'+CONVERT(VARCHAR(1000), CAST(@UserName AS binary(16)), 2)
PRINT @SQL
EXEC sp_executesql @SQL
GO  

GO

create_user_with_predictable_sid 'newuser1', '...'
GO

DROP PROCEDURE create_user_with_predictable_sid