【问题标题】:How to permit a SQL Server user to insert/update/delete data, but not alter schema?如何允许 SQL Server 用户插入/更新/删除数据,但不允许更改架构?
【发布时间】:2012-06-20 15:59:00
【问题描述】:

我的应用程序(C#、ASP.Net)需要在数据库中插入、更新和删除数据,并运行存储过程。我需要防止它修改数据库模式——不更改表、创建或删除、不更改存储过程。

我需要向应用程序用户授予哪些权限组合?只是“选择”是行不通的,因为它需要在表中插入/更新/删除数据。

如何检查特定登录的权限和访问权限? 如何授予或拒绝登录权限和访问权限? 我需要授予新用户(登录)权限以仅访问一个数据库。

使用带有 SSMS 的 SQL Server 2008 R2。

【问题讨论】:

    标签: c#-4.0 sql-server-2008-r2 user-roles


    【解决方案1】:

    如果你真的想在对象级别控制它,你可以这样做:

    GRANT SELECT,UPDATE,INSERT,DELETE ON dbo.table TO user;
    

    在架构级别:

    GRANT SELECT,UPDATE,INSERT,DELETE ON SCHEMA::dbo TO user;
    

    不过,理想情况下,您不允许针对您的表进行临时 DML,并通过存储过程控制所有 DML。在这种情况下,您只需要在过程本身上授予 exec 权限,而不是对其接触的对象:

    GRANT EXEC ON dbo.procedure TO user;
    

    类似地,如果您想允许对特定架构中的所有过程执行 exec,您可以说:

    GRANT EXEC ON SCHEMA::dbo TO user;
    

    一个例外是当您的存储过程组成动态 SQL 时。在这些情况下,您可能仍需要在动态 SQL 执行的上下文中对基础表应用权限,或者您可以使用EXECUTE AS OWNER

    【讨论】:

    • 授予“更新”和“删除”权限是否允许该用户更改和删除表?另外,我可以授予架构而不是每个表的权限吗?
    • 不,更新和删除指的是表中的数据,而不是数据本身。你总是可以试试这个。是的,我发布了一个示例,您可以在其中影响架构而不是每个对象(如果您稍后添加表,这将很有帮助,权限是继承的,除非您要添加用户 的表> 有权访问,那么您需要在该表上明确拒绝)。
    • 如何在 SSMS 中或通过脚本检查和修改登录权限?我应该为这个访问受限的新用户选择哪个服务器角色?
    • 你可以看看sys.database_permissions。我不知道您应该使用哪个服务器角色,但如果您授予显式权限,那么 public 应该足够了(可能需要 db_datareader / db_datawriter 取决于一堆其他因素)。安全是一个复杂的话题,我认为您可能需要教程或培训课程,而不是回复 cmets。
    • 我不知道任何副手,对不起。我会使用谷歌或必应搜索,你也可以这样做。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2019-04-16
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多