在安全系统中创建一项,以拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。

语法

语句权限:

DENY { ALL | statement [ ,...n ] }
TO security_account [ ,...n ]

对象权限:

DENY
    { ALL [ PRIVILEGES ] | permission [ ,...n ] }
    {
        [ ( column [ ,...n ] ) ] ON { table | view }
        | ON { table | view } [ ( column [ ,...n ] ) ]
        | ON { stored_procedure | extended_procedure }
        | ON { user_defined_function }
    }
TO security_account [ ,...n ]
[ CASCADE ]

参数

ALL

指定拒绝所有适用的权限。对于语句权限,只有 sysadmin 角色成员可以使用 ALL。对于对象权限,sysadmin db_owner 角色成员和数据库对象所有者都可以使用 ALL。

statement

是被拒绝权限的语句。语句列表可以包括:

  • CREATE DATABASE
  • CREATE DEFAULT
  • CREATE FUNCTION
  • CREATE PROCEDURE
  • CREATE RULE
  • CREATE TABLE
  • CREATE VIEW
  • BACKUP DATABASE
  • BACKUP LOG

n

是一个占位符,表示在以逗号分隔的列表中可以有重复的项目。

TO

指定安全帐户列表。

security_account

是当前数据库内受拒绝权限影响的安全帐户名称。安全帐户可以是:

  • Microsoft® SQL Server™ 用户。
  • SQL Server 角色。
  • Microsoft Windows NT® 用户。
  • Windows NT 组。

拒绝来自 SQL Server 用户或 Windows NT 用户帐户的权限时,受权限影响的唯一帐户是指定的 security_account。如果拒绝来自某个 SQL Server 角色或 Windows NT 组的权限,拒绝的权限将影响当前数据库内所有是该组或角色成员的用户,与已授予该组或角色成员的权限无关。如果组或角色与其成员的权限发生冲突,限制性最强的权限 (DENY) 优先。

DENY 可用于两种特殊的安全帐户。在 public 角色上拒绝的权限适用于数据库中的所有用户。在 guest 用户上拒绝的权限将由数据库内所有没有用户帐户的用户使用。

对 Windows NT 本地组或全局组拒绝权限时,指定在该组上定义的域名或计算机名,后面跟一个反斜线,然后是组名。但是,若要对 Windows NT 内置的本地组拒绝权限,请指定 BUILTIN 而不是域名或计算机名。

PRIVILEGES

是可以包含在符合 SQL-92 标准的语句中的可选关键字。

permission

是被拒绝的对象权限。在表或视图上拒绝权限时,权限列表可以包括一个或多个这些语句:SELECT、INSERT、DELETE 或 UPDATE。

在表上拒绝的对象权限还可以包括 REFERENCES,在存储过程或扩展存储过程上拒绝的对象权限可以包括 EXECUTE。在列上拒绝权限时,权限列表可以包括 SELECT 或 UPDATE。

column

是当前数据库内要被拒绝权限的列名。

table

是当前数据库内要被拒绝权限的表名。

view

是当前数据库内要被拒绝权限的视图名称。

stored_procedure

是当前数据库内要被拒绝权限的存储过程名称。

extended_procedure

是要被拒绝权限的扩展存储过程名称。

user_defined_function

是拒绝权限的用户定义函数名。

CASCADE

指定拒绝来自 security_account 的权限时,也将拒绝由 security_account 授权的任何其它安全帐户。拒绝可授予的权限时使用 CASCADE。如果没有指定 CASCADE,将给指定的用户授予 WITH GRANT OPTION 权限并返回错误。

注释

如果使用 DENY 语句禁止用户获得某个权限,那么以后将该用户添加到已得到该权限的组或角色时,该用户不能访问这个权限。

如果用户激活一个应用程序角色,DENY 对用户使用该应用程序角色访问的任何对象没有任何作用。虽然用户可能被拒绝访问当前数据库内的特定对象,但如果应用程序角色能够访问该对象,则当应用程序角色激活时,用户仍可以访问该对象。

使用 REVOKE 语句可从用户帐户中删除拒绝的权限。安全帐户不能访问删除的权限,除非将该权限授予了用户所在的组或角色。使用 GRANT 语句可删除拒绝的权限并将权限显式应用于安全帐户。

说明  在 SQL Server 6.x 版兼容模式中 DENY 是一个新关键字。DENY 专门用于拒绝来自用户帐户的权限,因为在 SQL Server 7.0 版中 REVOKE 只删除以前授予或拒绝的权限。使用 REVOKE 的现有 SQL Server 6.x 脚本可能必须改用 DENY 维护行为。

 

权限

默认情况下,将 DENY 权限授予 sysadmindb_ownerdb_securityadmin 角色成员和数据库对象所有者。

示例
A. 拒绝语句权限

下例对多个用户拒绝多个语句权限。用户不能使用 CREATE DATABASE 和 CREATE TABLE 语句,除非给他们显式授予权限。

DENY CREATE DATABASE, CREATE TABLE
TO Mary, John, [Corporate/BobJ]
B. 在权限层次结构内拒绝对象权限

下例显示权限的优先顺序。首先,给 public 角色授予 SELECT 权限。然后,拒绝用户 MaryJohnTom 的特定权限。这样,这些用户就没有对 authors 表的权限。

USE pubs
GO

GRANT SELECT
ON authors
TO public
GO

DENY SELECT, INSERT, UPDATE, DELETE
ON authors
TO Mary, John, Tom
C. 对 SQL Server 角色拒绝权限

下例对所有 Accouting 角色成员拒绝 CREATE TABLE 权限。即使已给现有的 Accouting 用户显式授予了 CREATE TABLE 权限,DENY 仍替代该权限。

DENY CREATE TABLE TO Accounting