如何设置只能执行一件事(运行存储过程)而不能执行其他任何操作的 SQL 用户?

如何设置只能执行一件事(运行存储过程)而不能执行其他任何操作的 SQL 用户?

我想允许我们域中某个组内的任何用户登录我们的一个数据库并运行特定的存储过程。这是这些用户应该能够执行的唯一操作。到目前为止,这是我在测试中实现的:

USE master;
GO

CREATE LOGIN [Domain\Group] FROM WINDOWS;
GO





USE [TheDatabase];
GO

CREATE USER [Domain\Group] FROM LOGIN [Domain\Group];
GO

CREATE PROCEDURE ProcedureName @TrueFalse VarChar(1), @Name VarChar(20)
    AS
    UPDATE [TheDatabase].[dbo].[TABLE_NAME] SET REMOVED = @TrueFalse WHERE NAME = @Name
GO

GRANT EXECUTE ON OBJECT::ProcedureName
    TO [Domain\Group]
GO

这使我能够使用属于 [Domain\Group] 的 Windows 帐户连接到 SQL Server 并运行存储过程EXEC ProcedureName 'T', 'NameOfRecord'

但是我注意到,如果我使用 SSMS 用这个帐户连接到服务器,我可以做很多事情。到目前为止,我还没有发现任何可以让用户操作数据的东西,但用户可以查看很多东西。

最好的情况下,我希望用户能够运行 SP,并且只运行 SP,不运行其他任何操作,无论是使用 SSMS 还是任何其他应用程序。

我可以做到这一点吗?或者查看这些信息是否只是授予用户任何级别的数据库访问权限而接受的风险?

信息:

通过直接查询,我无法对该用户执行任何操作(我知道要测试),但通过 SSMS 等 GUI,我可以看到某些信息:

在 SSMS 的对象资源管理器中,几乎所有项目都可以展开和查看(数据库、系统数据库、安全、登录、管理、系统策略)。我不能确定其中哪些可以完整查看,因为其中一些项目在服务器中根本不存在,其中一些项目显示的视图有限(sa 帐户可以看到更多条目,但此用户可以看到一些条目),而其中一些项目向此用户显示所有条目。

通过 GUI,用户可以更改自己的登录属性,例如默认数据库。这会影响整个 [Domain\Group] 登录,而不仅仅是登录的特定用户。

以下查询返回一行,显示授予对指定存储过程执行的权限:

select 
    sys.schemas.name 'Schema', 
    sys.objects.name Object, 
    sys.database_principals.name username, 
    sys.database_permissions.type permissions_type, 
    sys.database_permissions.permission_name, 
    sys.database_permissions.state permission_state, 
    sys.database_permissions.state_desc, 
    state_desc + ' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + sys.objects.name + '] to [' + sys.database_principals.name + ']' COLLATE LATIN1_General_CI_AS
from 
    sys.database_permissions
    join sys.objects on sys.database_permissions.major_id = sys.objects.object_id
    join sys.schemas on sys.objects.schema_id = sys.schemas.schema_id
    join sys.database_principals on sys.database_permissions.grantee_principal_id =  sys.database_principals.principal_id

数据库上的用户的 GUI 视图(通过 sa 帐户查看): 数据库上的用户的 GUI 视图(通过 sa 帐户查看):

相关内容