作为db_owner和GRANT ALL有什么区别?

时间:2011-10-06 05:49:46

标签: sql-server database tsql

我一直在使用以下SQL来创建用户,登录和数据库。

USE master;
GO
CREATE DATABASE TEST;
GO
USE TEST;
GO
CREATE LOGIN TEST_USER WITH PASSWORD = 'password';
EXEC sp_defaultdb @loginame='TEST_USER', @defdb='TEST'
CREATE USER TEST_USER FOR LOGIN TEST_USER WITH DEFAULT_SCHEMA = DBO;
EXEC sp_addrolemember 'db_owner','TEST_USER'
GO
GRANT ALL TO TEST_USER;
GRANT ALTER ON SCHEMA::dbo TO TEST_USER
GO

当被问到时,我发现自己无法解释使我的用户成为数据库所有者之间的区别(为了创建/更改/删除表等):

EXEC sp_addrolemember 'db_owner','TEST_USER'

并向用户授予所有权限,我认为该权限基本上具有相同的权限。

GRANT ALL TO TEST_USER;

它们是一样的吗?或者说我母亲总是这样说:你可以把马带到水中,但这不能使他成为一名DBA?

罗布

:)

2 个答案:

答案 0 :(得分:4)

安全的所有者不能拒绝权限。但是,被授予ALL的用户仍然可以被安全的显式DENY拒绝(DENY优先于所有/任何GRANT)。因此,作为组Foo成员的用户可以通过组成员资格授予所有权限,但如果他也是在表X上拒绝SELECT的组Bar的成员,则将拒绝用户从所述表中进行选择。如果用户是表X的所有者,那么DENY不会影响他。这适用于任何级别的任何对象,包括数据库所有权和dbo。

这将是授予所有权和所有权之间的区别,但请注意,固定角色db_owners的成员资格与dbo不同。具体来说,群组不会拥有安全性,用户会这样做(或者至少应该如此......但我离题了。)

答案 1 :(得分:2)

除了所有者对DENY免疫,还在SQL Server GRANT ALL is deprecated, and it doesn't grant all possible permissions中。 (DENY ALLREVOKE ALL也已弃用。)

  

此选项已弃用,仅针对后退维护   兼容性。它不授予所有可能的权限。授予   ALL等同于授予以下权限。

     
      
  • 如果安全数据库是数据库,则ALL表示BACKUP DATABASE,BACKUP LOG,   创建数据库,创建默认,创建功能,创建过程,   创建规则,创建表和创建视图。

  •   
  • 如果安全性是标量函数,则ALL表示EXECUTE和   参考

  •   
  • 如果安全性是表值函数,则ALL表示DELETE,INSERT,   参考,选择和更新。

  •   
  • 如果安全是存储过程,则ALL表示执行。

  •   
  • 如果安全是一个表,ALL表示DELETE,INSERT,REFERENCES,   选择和更新。

  •   
  • 如果安全是视图,则ALL表示DELETE,INSERT,REFERENCES,   选择和更新。

  •   

您可以GRANT ALL而不使用WITH GRANT OPTION