2015-06-09 3 views
2

Я пытаюсь запустить запрос, чтобы отбросить логины сервера из окон и воссоздать их. Я запустить этот запрос, чтобы уронить логины и он работает отличноКак сопоставить имя sysname в sql-сервере

USE master 
SELECT 
     'IF EXISTS (SELECT * FROM sys.server_principals WHERE name = ' + 
     '''' + [name] + '''' + ')' + 
     ' BEGIN DROP LOGIN ' + QUOTENAME([name]) + ' END; ' + 
     'CREATE LOGIN ' + QUOTENAME([name]) + ' FROM WINDOWS; ' 
FROM sys.server_principals 
WHERE type_desc IN ('WINDOWS_GROUP' , 'WINDOWS_LOGIN') 

Но следующий запрос

USE master 
SELECT 
     'ALTER LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_DATABASE = ' + 
     spr.default_database_name 
     + 'GRANT ' + spe.permission_name + ' to ' + QUOTENAME([name]) 
     + CASE WHEN spr.default_database_name IS NOT NULL 
      THEN ' WITH DEFAULT DATABASE = ' + spr.default_database_name 
      ELSE 
      '' 
     END 
FROM sys.server_principals spr INNER JOIN 
    sys.server_permissions spe ON spr.principal_id = spe.grantee_principal_id 
WHERE spr.type_desc IN ('WINDOWS_GROUP', 'WINDOWS_LOGIN') 

возвращается эту ошибку

Cannot resolve collation conflict for column 1 in SELECT statement. 

Так что, когда я исследовал этот вопрос он исходит из sysname столбец default_database_name Запрос выполнялся, когда я использовал spr.default_database_name COLLATE Latin1_General_CI_AI Квест с тремя частями ion: Я получил проблему из-за строки или из-за того, что тип данных столбца равен sysname ?. Является ли COLLATE Latin1_General_CI_AI правильным синтаксисом для этого сценария ?. когда я выполнить этот запрос

SELECT name, description 
FROM sys.fn_helpcollations() 

Результаты показывают много сортировки для различных языков. Итак, как я получил эту ошибку для полностью английской базы данных.

Edit: Я побежал эти два запроса, чтобы проверить свойство сортировки для базы данных и сервера

SELECT DATABASEPROPERTYEX(N'master', N'Collation') 
SELECT SERVERPROPERTY(N'Collation') 

и результат в обоих из них был

SQL_Latin1_General_CP1_CI_AS 
+0

Я предполагаю, что сортировка базы данных отличается от сортировки сервера. (Это не типично, но это, конечно, не редкость.) Если вы запустите 'SELECT DATABASEPROPERTYEX (N'MyDatabaseName ', N'Collation')' и 'SELECT SERVERPROPERTY (N'Collation ')', каковы ваши результаты? – DeadZone

+0

@DeadZone благодарит за ваш комментарий. Я буду обновлять свой ответ, чтобы включить результаты для этих запросов. – BICube

+0

Если вы запустите 'sp_help [sys.server_principals];' и посмотрите на сортировку столбца 'default_database_name', соответствует ли это? – DeadZone

ответ

0

Это может помочь принести сопоставление по умолчанию для экземпляра базы данных и сервера, изменение запроса, как показано ниже:

SELECT 
     'ALTER LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_DATABASE = ' + 
     spr.default_database_name COLLATE database_default 
     + 'GRANT ' + spe.permission_name + ' to ' + QUOTENAME([name]) 
     + CASE WHEN spr.default_database_name IS NOT NULL 
      THEN ' WITH DEFAULT DATABASE = ' + spr.default_database_name COLLATE database_default 
      ELSE 
      '' 
     END 
FROM sys.server_principals spr INNER JOIN 
    sys.server_permissions spe ON spr.principal_id = spe.grantee_principal_id 
WHERE spr.type_desc IN ('WINDOWS_GROUP', 'WINDOWS_LOGIN') 
Смежные вопросы