Одна вещь, которую я всегда ненавидел больше, чем что-либо в MS SQL Server, - это способ обеспечения безопасности. Контекст безопасности постоянно переключается, если вы смотрите на сервер смешно, и часто это очень сложно (для меня в любом случае) для прогнозирования или отладки.Определение текущих проверок безопасности (SQL Server)
Сегодня, имея дело с проблемой, я хотел бы просто добавить строку в свой код, который отображает контекст безопасности, который SQL Server использует при запуске этого кода ». Существует ли такая команда? Например, SELECT security_context()
Чтобы быть немного яснее ... если я нахожусь в хранимой процедуре, и поэтому я должен быть в контексте безопасности владельца SP, то я хотел бы это увидеть. Если я в коде, вызванном sp_executesql, и это приведет к тому, что безопасность будет находиться в контексте учетной записи службы SQL Server, я бы хотел это увидеть.
По крайней мере, я мог бы выяснить, почему SQL Server считает, что я не должен иметь доступ к чему-либо.
Спасибо!
Пример
-- Set up
CREATE USER Test_User WITHOUT LOGIN
CREATE TABLE Test_Security_Context (my_id INT)
INSERT INTO Test_Security_Context VALUES (1)
DENY SELECT ON Test_Security_Context TO Test_User
GO
CREATE PROCEDURE Test_Security_Context_SP
AS
SELECT SUSER_SNAME()
SELECT * FROM Test_Security_Context -- This will return ok
EXEC('SELECT SUSER_SNAME(); SELECT * FROM Test_Security_Context') -- SUSER_SNAME() will match above but select fails
GO
GRANT EXECUTE ON Test_Security_Context_SP TO Test_User
GO
-- Switch to the new user
SETUSER 'Test_User'
GO
-- Do the test
EXEC Test_Security_Context_SP
GO
-- Clean up
SETUSER
DROP PROCEDURE Test_Security_Context_SP
DROP TABLE Test_Security_Context
DROP USER Test_User
GO
+ 1 Wow. Один вопрос: почему login_token для 'builtin \ administrators' говорит' deny only'? Я ожидал, что это послужило причиной большинства моих грантов! – Andomar
@Andomar: Я думаю, это Vista LUA, это изменяет токен администратора но я не уверен. –
Может быть, с моей терминологией, с плохой терминологией. Я ищу: «Вот почему у вас нет прав» и «Вот почему у вас есть разрешения». м вероятно, слишком много, но я знаю, что я не одинок в своей ненависти к попытке распутать такие ошибки безопасности, особенно когда речь идет о междоменном доступе, динамическом SQL и т. д. –