有一件事我一直討厭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哇!一個問題:爲什麼'builtin \ administrators'的login_token說'只拒絕'?我原以爲這是我的大部分撥款的原因! – Andomar 2010-08-03 04:49:25
@Andomar:我認爲是Vista LUA,它修改了管理員令牌但我不確定 – 2010-08-03 05:52:40
也許我的角色很糟糕,我在尋找的是「這就是爲什麼你沒有權限」和「這就是爲什麼你有權限」米可能會問太多,但我知道,我並不孤單,試圖解開這些類型的安全漏洞,特別是當涉及到跨數據庫訪問,動態SQL等。 – 2010-08-03 14:53:52