REVOKE removes previously granted or denied permissions from SQL Server principals, immediately blocking those actions.
REVOKE removes a permission that was earlier granted or denied. After execution, the affected principal inherits access only through other explicit GRANTs or role memberships, making it invaluable for tightening security without adding DENY entries.
Use REVOKE when you simply want to clear a permission so that higher-level role or schema settings can flow down. Use DENY when you need an explicit, hard block that overrides any GRANTs.
REVOKE SELECT ON dbo.Products TO SalesReader;
REVOKE SELECT, INSERT ON dbo.Orders TO AnalystRole;
REVOKE GRANT OPTION FOR UPDATE ON dbo.Customers TO dev_user;
REVOKE EXECUTE ON SCHEMA::sales TO app_service;
Yes. List multiple principals separated by commas: REVOKE SELECT ON dbo.Products FROM Alice, Bob, Carol;
Suppose SupportTeam originally had SELECT on Orders. The finance department now handles that report. Revoke access:
REVOKE SELECT ON dbo.Orders TO SupportTeam;
SupportTeam can no longer query Orders unless another role grants it indirectly.
Audit before you revoke using sys.database_permissions. Test revokes in staging. Prefer revoking at the role level rather than individual users to keep security manageable.
The engine re-evaluates effective permissions instantly. Users may regain access through other GRANTs, roles, or ownership chains. Verify with sys.fn_my_permissions.
If a user still accesses data after REVOKE, look for cascading GRANTs from roles, schemas, or the dbo ownership chain. Use sys.database_principals to trace inheritance.
Only if you specify the CASCADE option when revoking at a higher securable level, such as a schema. Without CASCADE, underlying object permissions remain.
Yes. Simply GRANT the permission again to the principal. There is no transaction log shortcut; you must reissue the GRANT.
Yes. REVOKE statements are fully logged and can be audited via SQL Server Audit or the default trace depending on configuration.