Настоящая загадка с поведением SUSER_SID в простом запросе T-SQL - PullRequest
2 голосов
/ 07 марта 2012

Я набираю следующий код T-SQL в окне запроса sql:

-- Get the SUSER_SID standalone
SELECT SUSER_SID('sql_someuser') AS SUSER_SID_OF_SQL_SOMEUSER

-- Get the SUSER_SID as part of a more complex query (should be the same, right?)
SELECT UserSid, UserId FROM User..UserSidToUserId 
UNION ALL
SELECT SUSER_SID('sql_someuser'),12345

Вот набор результатов, который я получаю:

enter image description here

первые две строки второго набора результатов выходят прямо из таблицы UserSidToUserId.Но эта последняя строка, та с UserId из 12345, которая добавляется вторым запросом UNION ALL, та, чья UserSid генерируется при втором вызове SUSER_SID с одно и то же имя пользователя отличается!

Обновление: Чтобы не было путаницы, вот определение таблицы UserSidToUserId:

CREATE TABLE dbo.UserSidToUserId
(
  UserSid uniqueidentifier NOT NULL,
  UserId int NOT NULL,
)

Как два вызова с одним и тем же именем пользователя на SUSER_SID могут давать результаты, которые зависят от контекста, в котором используется SUSER_SID, если это абсолютный вызов, который не зависит от контекста?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Ваш UNION преобразует секунду в строку, предположительно, однако, вы определили User..UserSidToUserId.UserSid.Обратите внимание на разные ответы:

SELECT SUSER_SID(), CONVERT(VARCHAR(64), SUSER_SID());
0 голосов
/ 07 марта 2012

Решение состоит в том, что оказывается, что порядок байтов UNIQUEIDENTIFIER отличается от порядка типа BINARY, причем некоторые части расположены в порядке байтов хоста, а другие - в порядке сетевых байтов. Чтобы два результата совпали, вы должны сделать:

SELECT (CONVERT(UNIQUEIDENTIFIER,SUSER_SID('sql_someuser'))) 
       AS SUSER_SID_OF_SQL_SOMEUSER_AS_UUID

Теперь он будет соответствовать последней строке вывода:

-- Get the SUSER_SID as part of a more complex query (should be the same, right?)    
SELECT UserSid, UserId FROM User..UserSidToUserId     
UNION ALL    
SELECT SUSER_SID('sql_someuser'),12345 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...