Меню

Microsoft sql server ошибка 15025

imageВо время миграции баз данных SQL Server 2012 из ранее используемого кластерного экземпляра SQL Server на физических серверах в новый кластерный экземпляр в виртуальной среде Hyper-V столкнулся с одной интересной проблемой. Сразу скажу, что она никак не связана ни с Hyper-V, ни с виртуализацией в целом, а скорее с простым незнанием некоторых аспектов работы SQL Server.

При копировании баз данных была предпринята попытка использования мастера копирования баз (Copy Database Wizard), который доступен нам в составе SQL Server Management Studio по аналогии с ранее описанной процедурой. Процедура копирования контентной базы данных одного из веб-приложений SharePoint и связанных с ней SQL-логинов была прервана с ошибкой, говорящей о том, что один из SQL-логинов невозможно найти в домене. Выяснилось, что этот SQL-логин когда-то ранее было создан на SQL Server с привязкой к существующей на тот момент доменной учетной записи пользователя, однако на текущий момент учётной записи с таким именем в домене действительно нет. Это подтвердил также и вывод хранимой процедуры sp_validatelogins, которая умеет обнаруживать “осиротевшие” SQL-логины:

EXEC sp_validatelogins; 
GO

image

В нашем примере проблемный SQL-логин имел имя KOMs-KOM-SP-ORD. Соответственно этому SQL-логину ранее и были права необходимые для работы с контентной базой данных веб-приложения SharePoint, но вместе с этим само веб-приложение в SharePoint на текущий момент времени работало от имени совершенно другой учетной записи – KOMs-KOM-SP-IRS. Это ввело меня в некоторый ступор. Как такое вообще возможно… И пока до меня не “дошло”, в чём же на самом деле заключается проблема, выполнялись разного рода манипуляции. Например, будучи уверенным в том, что учетной записи веб-приложения таки нужен доступ к его контентной базе данных SharePoint, я попытался добавить в SQL Server новый SQL-логин — KOMs-KOM-SP-IRS. Но в ответ получил странное сообщение о том, что такой логин в SQL Server уже присутствует… 

Create failed for Login 'XXXXXX'.  (Microsoft.SqlServer.Smo)
...
The server principal 'XXXXXX' already exists. (Microsoft SQL Server, Error: 15025)

image

Но как? Ведь я не вижу этого логина в консоли…

И тут меня осенило, что скорее всего, нынешняя доменная учетная запись KOMs-KOM-SP-IRS это и есть учётная запись KOMs-KOM-SP-ORD, просто переименованная в домене после того, как в SQL Server был создан сопряжённый с ней SQL-логин. Чтобы проверить это предположение, нужно было выяснить доменный идентификатор безопасности (SID) хранимый в SQL Server для SQL-логина KOMs-KOM-SP-ORD и сравнить его с SID пользователя KOMs-KOM-SP-IRS в домене на данный момент. Новой сложностью стало то, что SQL Server возвращает значение SID в формате VARBINARY(85), а в домене оно хранится в другом формате.

Выполнить преобразование полученного из SQL Server значения SID в формат аналогичный атрибуту objectSid для учетных записей в домене Active Directory помог SQL-скрипт из статьи Help: SQL Server — SQL Internals — How to map login SID to domain account?, за что её автору большое спасибо…

DECLARE @varBinarySID VARBINARY(85)
-- в переменной varBinarySID указываем значение SID в формате varbinary(85)
SELECT @varBinarySID = 0x010500000000000515000000685889B0E3259CD7E0ED9A5545030300
DECLARE @StringSID VARCHAR(100)
DECLARE @len AS INT
SET @len = LEN(@varBinarySID)
DECLARE @loop AS INT
SELECT @StringSID = 'S-'
SELECT @StringSID = @StringSID + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@varBinarySID, 1, 1))))
SELECT @StringSID = @StringSID + '-'
SELECT @StringSID = @StringSID + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@varBinarySID, 3, 6))))
SET @loop = 9
WHILE @loop < @len
BEGIN
    DECLARE @temp_var BINARY (4)
    SELECT @temp_var = SUBSTRING(@varBinarySID, @loop, 4)
    SELECT @StringSID = @StringSID + '-' + CONVERT(VARCHAR, CONVERT(BIGINT, CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @temp_var)))))
    SET @loop = @loop + 4
END
SELECT @StringSID 'String SID'

image

Итак, значение objectSid в более привычном формате получено  и теперь всё что остаётся сделать, это сравнить это значение с учетной записью KOMs-KOM-SP-IRS. Методов для этого много разных, как один из самых простых и быстрых воспользоваться обратным преобразованием SID в имя с помощью утилиты Марка Руссиновича — Psgetsid

image

Получается, что действительно, SQL-логин KOMs-KOM-SP-ORD имеет привязку к доменному SID учетной записи KOMs-KOM-SP-IRS. Как я уже и сказал, такая ситуация возможна в случае если в домене учетная запись была переименована после создания соответствующего логина в SQL Server. Теперь, чтобы окончательно поставить всё на свои места осталось только переименовать SQL-логин в актуальное для доменной учетной записи имя.

  • Hi Muhammed,

    Please go through the below steps,

    
    
    use master 
    go
    drop login <yourloginname>
    go
    create login <yourloginname> with password='yourpassword',<requiredoptions>
    go

    for the various option available with create login pls refer :

    http://msdn.microsoft.com/en-us/library/ms189751.aspx

    If the login is already there, you can try to fix the orphan users in DB instead of deleting the login.

     you can use

    alter user username with login=loginname

    please refer alter user syntax here

    http://msdn.microsoft.com/en-us/library/ms176060.aspx

    or

    You can make use of  sp_change_users_login which is deprecated to fix the orphan user issue after restoring Db from one server to another server.

    After fixing the orphan users issue your login in the new server will be able to connect to the restored DB with all the permissions as in the old server.

    But if you have already deleted the users in the DB, then you have to create the user for the login.

    Thanks

    • Edited by

      Tuesday, June 18, 2013 8:47 AM

    • Marked as answer by
      Fanny Liu
      Saturday, June 22, 2013 9:38 AM

    • Question

    • Hi guys, my colleague deleted by mistake a user. Now I tried to create the login again but it did say the login is already in the server. I deleted the login from each database it was linked but the error The server principal NetworkNameUserName already
      exist. The user can connect a linked server which I granted for him. Quite strange.

      Why I can’t add the user again. What can I do?

    All replies

    • Your college probably deleted a database user and not a login. It does not sound like he actually deleted a login as QSL Serer things it already exists.

      What problem is this causing for you?

    • Update. I refreshed and the user did appear again but only for one db it’s happen this strange behavior. I set the user as db reader, I click ok, I close the mask and when I open the mask again the db reader is unticked. Any idea why?

    • What does this query show?

      select u.name,r.name from sys.database_principals u
      join sys.database_role_members dp on dp.member_principal_id=u.principal_id
      join sys.database_principals r on r.type='R' and dp.role_principal_id=r.principal_id
      where u.name='DatabaseUserName'
      

    • And if you try this:

      exec sp_addrolemember 'db_datareader', 'MyDatabaseUser'  

      And then run the query?

      Are there any database triggers on this database?

    • It says Command completely successfully but if I see the database in the user mask is still unticked. No triggers.

    • Does the user now show up in here?

      select u.name,r.name from sys.database_principals u
      join sys.database_role_members dp on dp.member_principal_id=u.principal_id
      join sys.database_principals r on r.type='R' and dp.role_principal_id=r.principal_id
      where u.name='DatabaseUserName'
      

      If the user in the db_owner role as well?

    • Nothing. It doesn’t show up.

    • I guess something wrong in the db.

    • sometimes the error 15025 resolved by removing windows account which is still in the sql server account list. please take a look on here if it is helpful for you:
      https://blogs.msdn.microsoft.com/sqlserverfaq/2010/04/06/unable-to-create-a-login-in-sql-server-2005-and-we-get-the-following-error-the-server-principal-domainmachine-account-already-exists/

    • Question

    • Hi guys, my colleague deleted by mistake a user. Now I tried to create the login again but it did say the login is already in the server. I deleted the login from each database it was linked but the error The server principal NetworkNameUserName already
      exist. The user can connect a linked server which I granted for him. Quite strange.

      Why I can’t add the user again. What can I do?

    All replies

    • Your college probably deleted a database user and not a login. It does not sound like he actually deleted a login as QSL Serer things it already exists.

      What problem is this causing for you?

    • Update. I refreshed and the user did appear again but only for one db it’s happen this strange behavior. I set the user as db reader, I click ok, I close the mask and when I open the mask again the db reader is unticked. Any idea why?

    • What does this query show?

      select u.name,r.name from sys.database_principals u
      join sys.database_role_members dp on dp.member_principal_id=u.principal_id
      join sys.database_principals r on r.type='R' and dp.role_principal_id=r.principal_id
      where u.name='DatabaseUserName'
      

    • And if you try this:

      exec sp_addrolemember 'db_datareader', 'MyDatabaseUser'  

      And then run the query?

      Are there any database triggers on this database?

    • It says Command completely successfully but if I see the database in the user mask is still unticked. No triggers.

    • Does the user now show up in here?

      select u.name,r.name from sys.database_principals u
      join sys.database_role_members dp on dp.member_principal_id=u.principal_id
      join sys.database_principals r on r.type='R' and dp.role_principal_id=r.principal_id
      where u.name='DatabaseUserName'
      

      If the user in the db_owner role as well?

    • Nothing. It doesn’t show up.

    • I guess something wrong in the db.

    • sometimes the error 15025 resolved by removing windows account which is still in the sql server account list. please take a look on here if it is helpful for you:
      https://blogs.msdn.microsoft.com/sqlserverfaq/2010/04/06/unable-to-create-a-login-in-sql-server-2005-and-we-get-the-following-error-the-server-principal-domainmachine-account-already-exists/

    I have a user who is using the application except for one view she cannot get access to.
    she has rights to it in the application however, when look at the sql users she is not there as the integrated windows login or as a user under the database

    when I try and recreate her I get

    The server principal ‘mydomaingoldiee’ already exists. (Microsoft SQL Server, Error: 15025)

    any suggestions on how to resolve

    Microsoft SQL Server 2008

    Not exactly the question you had in mind?

    Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.

    ask a question

    Not exactly the question you had in mind?

    Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.

    ask a question

    Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!

    Unlimited question asking, solutions, articles and more.

    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии

    А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ятрогенная патология врачебные ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Microsoft sql server ошибка 1225