Функции, возвращающие имена и идентификаторы пользователей

Несколько системных функций возвращают имена и идентификаторы пользователей. Понимание параметров и вывода этих функций требует понимания типов имен и идентификаторов, используемых в SQL Server.

Каждый пользователь, подключающийся к SQL Server, имеет два уровня имен в SQL Server, каждое из которых связывается с уникальным идентификатором.

  • Имя входа

    Каждый пользователь, для которого разрешен вход на SQL Server, имеет имя входа, которое обеспечивает ему доступ на экземпляр SQL Server. Существует два типа имен входа:

    • Имена учетных записей Microsoft Windows

      При помощи хранимой процедуры sp_grantlogin члены предопределенных ролей сервера sysadmin или securityadmin могут разрешить учетным записям Windows отдельных пользователей вход на экземпляр SQL Server. Пользователь, определенный учетной записью Windows, или любой пользователь в группе Windows может подключиться к экземпляру SQL Server, используя проверку подлинности Windows. Все учетные записи Windows или имена группы хранятся в таблице sys.server_principals. Идентификатор защиты Windows для учетной записи или группы Windows хранится в таблице sys.server_principals.sid.

    • Имена входа SQL Server

      Они используются, когда пользователь при входе использует проверку подлинности SQL Server. Имена входа SQL Server определяются членами предопределенных ролей сервера sysadmin или securityadmin при помощи хранимой процедуры sp_addlogin. Все имена входа SQL Server хранятся в таблице master.dbo.syslogins.loginname. SQL Server формирует идентификатор GUID, который используется в качестве идентификатора защиты и хранится в таблице sys.server_principals.sid.

      SQL Server использует поле sys.server_principals.sid в качестве security_identifier для имени входа.

  • Имя пользователя базы данных

    Каждая учетная запись Windows или имя входа SQL Server должны быть связаны с именем пользователя в каждой базе данных, к которой у пользователя есть доступ, либо база данных должна поддерживать доступ для пользователя guest. Имена пользователей базы данных определены членами предопределенной роли сервера db_owner или предопределенной роли базы данных db_accessadmin и хранятся в таблице sys.database_principals, имеющейся в каждой базе данных. Каждое имя пользователя связано с идентификатором пользователя базы данных в столбце sys.database_principals.uid.

    Параметр security identifier для каждого пользователя хранится в таблице sys.database_principals.sid; таким образом, можно связать пользователей с их именами входа. Гораздо проще, если имя для базы пользователя базы данных совпадает с именем входа SQL Server или учетной записи Windows, однако это не является обязательным.

Получение учетных записей или идентификаторов имен входа

При подключении к экземпляру SQL Server получить идентификаторы или учетные записи имен входа можно следующим образом:

  • Функция SUSER_SNAME возвращает имя входа SQL Server или учетной записи Windows, связанной с идентификатором security identifier.

  • Функция SUSER_SNAME возвращает идентификатор security identifier, связанный с именем входа SQL Server или учетной записью Windows.

  • Функция SUSER_SID() (функция SUSER_SID, указанная без параметра login_account) возвращает идентификатор security identifier текущего соединения, независимо от используемой проверки подлинности SQL Server или Windows.

  • Функция SYSTEM_USE стандарта ISO возвращает учетную запись Windows для подключения с использованием проверки подлинности Windows или имя входа SQL Server для подключения с использованием проверки подлинности SQL Server. В Transact-SQL функция SYSTEM_USER является синонимом SUSER_SNAME() (SUSER_SNAME без аргумента security_identifier).

В SQL Server работа функций, осуществляющих возврат имен входа или учетных записей, выполняется следующим образом:

  • SUSER_SNAME(security_identifier)

    Функция SUSER_SNAME в качестве аргумента принимает либо:

    • Идентификатор security_identifier для учетной записи или группы Windows, в случае чего возвращается имя учетной записи или группы Windows.

    • Либо псевдоидентификатор security_identifier, сформированный для имени входа SQL Server, в случае чего возвращается имя входа SQL Server.

    Если аргумент security_identifier не указан для соединения, установленного при помощи проверки подлинности Windows, функция SUSER_SNAME возвращает имя учетной записи Windows, связанной с соединением. Если соединение установлено при помощи проверки подлинности SQL Server, SUSER_SNAME возвращает имя входа SQL Server, связанное с соединением.

  • SYSTEM_USER

    В стандарте ISO функция SYSTEM_USER реализована в виде синонима SUSER_SNAME(). (Функция SUSER_SNAME указывается без аргумента security_identifier).

Получение имен и идентификаторов пользователей базы данных

Если соединение с экземпляром SQL Server установлено, получить имена и идентификаторы пользователей можно следующим образом.

  • Функция USER_ID возвращает идентификатор пользователя базы данных, связанный с именем пользователя базы данных.

  • Функция USER_ID() возвращает идентификатор пользователя базы данных, связанный с текущим соединением.

  • Функция USER_NAME возвращает имя пользователя базы данных, связанное с идентификатором пользователя базы данных.

  • Функции CURRENT_USER или SESSION_USER стандарта ISO возвращают имя пользователя базы данных, связанное с текущим соединением. В языке Transact-SQL эти функции реализованы в виде функции USER_NAME(). (Функция USER_NAME указывается без аргумента database_user_ID). В языке Transact-SQL функция USER также реализована в виде синонима USER_SNAME().

    Стандарт ISO разрешает кодировку инструкций SQL в модули SQL, которые могут иметь идентификаторы авторизации, отличные от идентификаторов авторизации пользователя, подключившегося к базе данных SQL. Стандарт ISO указывает, что функция SESSION_USER всегда возвращает идентификатор авторизации пользователя, осуществившего подключение. Функция CURRENT_USER возвращает идентификатор авторизации модуля SQL для любой инструкции из модуля SQL, либо идентификатор пользователя, установившего соединение, если инструкции SQL выполнялись не из модуля SQL. Если у модуля SQL нет отдельного идентификатора авторизации, то стандарт ISO определяет, что функция CURRENT_USER возвращает то же значение, что и SESSION_USER. В SQL Server нет отдельных идентификаторов авторизации для модулей SQL; таким образом, функции CURRENT_USER и SESSION_USER всегда одинаковы. Функция USER определяется в стандарте ISO как функция обратной совместимости с приложениями, написанными для более ранних версий. Она возвращает то же значение, что и CURRENT_USER.

В SQL Server работа функций, осуществляющих возврат имен входа или учетных записей, выполняется следующим образом:

  • USER_ID('database_user_name')

    Функция USER_ID возвращает идентификатор пользователя, связанный с указанным именем пользователя базы данных. Если параметр database_user_name не указан, функция USER_ID возвращает идентификатор пользователя базы данных, связанный с текущим соединением.

  • USER_NAME(database_user_ID)

    Функция USER_NAME возвращает имя пользователя базы данных, связанное с указанным идентификатором пользователя базы данных. Если параметр database_user_ID не указан, функция USER_NAME возвращает имя пользователя базы данных, связанное с текущим соединением.

  • CURRENT_USER, SESSION_USER, USER

    Эти функции являются синонимами функции USER_NAME(). (Функция USER NAME, указанная без параметра database_user_ID).