除了 MS 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