私がMSSQLServerの何よりも常に嫌っていたのは、セキュリティの仕組みです。サーバーを面白く見ると、セキュリティコンテキストは常に切り替わり、予測やデバッグが非常に難しいことがよくあります(とにかく私にとっては)。
しかし、今日の問題に対処する際に、「このコードの実行時にSQLServerが使用しているセキュリティコンテキストを表示する行をコードに追加できればいいのにと思います。」そのようなコマンドは存在しますか?例えば、SELECT security_context()
もう少し明確にするために...私がストアドプロシージャを使用していて、そのためにSPの所有者のセキュリティコンテキストの対象である場合は、それを確認したいと思います。sp_executesqlによって呼び出されたコードを使用していて、セキュリティがSQL Serverサービスアカウントのコンテキスト下にある場合は、それを確認したいと思います。
少なくとも、SQLServerが何かにアクセスするべきではないと考える理由を理解できるかもしれません。
ありがとう!
例
-- 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