Mar*_*ica 7 t-sql sql-server locale windows-server-2008-r2
给定Windows Server 2008 R2系统,其中服务帐户使用非英语显示语言,使用SQL Server 2008,以下Transact-SQL语句失败:
CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS ...
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
未找到Windows NT用户或组"NT AUTHORITY\NETWORK SERVICE".再次检查名称.
(或服务帐户的非英语显示语言中的相同消息,具体取决于上下文).
如果服务帐户使用英语作为其显示语言,则相同的语句会成功.
原因似乎很清楚:例如,在德国系统中,此帐户的显示名称是NT-AUTORITÄT\NETZWERKDIENST,并且名称NT AUTHORITY\NETWORK SERVICE(带空格)无法识别.此外,非本地化名称NT AUTHORITY\NETWORKSERVICE(无空格)也不起作用.
我的问题:我应该如何重写上述声明,使其无论显示语言如何都能正常工作?或者我被迫找出本地化名称(在我的情况下是InstallScript)?然后我就可以用了
CREATE LOGIN [NT-AUTORITÄT\NETZWERKDIENST] FROM WINDOWS
Run Code Online (Sandbox Code Playgroud)
哪个确实有用......
根据我的尝试,以及从我在名为“ SQL Server nutzen的知名SID”的德语论坛线程中阅读的内容,这是不可能的。显然,不幸的CREATE LOGIN是,SQL Server 设计为仅接受DOMAIN \ username格式的本地化名称。
来自同一线程的提示是,在“设置Windows服务帐户”中的“本地化服务名称”部分中查找需要在CREATE LOGIN语句中使用的本地化名称。
唯一的选择是尝试找出运行SQL Server的Windows系统的系统语言,然后使用“本地化的服务名称”表查找本地化的服务帐户名称,然后使用该名称来创建工作CREATE LOGIN语句。
小智 5
这对我在 SQL Server 2008R2 上有效:
IF (SELECT COUNT(*) FROM sys.server_principals WHERE sid=0x010100000000000514000000)=0
BEGIN
DECLARE @cmd VARCHAR(200)
SET @cmd = N'CREATE LOGIN [' + SUSER_SNAME(0x010100000000000514000000) + '] FROM WINDOWS'
EXEC (@cmd)
PRINT 'Created network service server login from SID'
END
ELSE
PRINT 'Network service account found from SID, server login not created'
Run Code Online (Sandbox Code Playgroud)
任何人都可以在非英语 Windows(德语、意大利语)上验证这一点吗?