我一直在使用以下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?
罗布
:)
答案 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 ALL
和REVOKE 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
。