Sql server拒绝删除视图到角色

时间:2014-01-22 12:59:57

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

我使用SQL Server 2008 R2并且想要拒绝删除任何开发者角色的视图。

如何添加拒绝权限以删除此角色的任何视图。

按数据库触发可以防止删除所有用户的任何视图。

3 个答案:

答案 0 :(得分:2)

这里的问题是拒绝许可适用于以下安全措施:

  • 同义词
  • 表和列
  • 观看次数和列

所以你可以使用:

USE dbName
GO
DENY DELETE TO [developerRole]
GO

问题在于我假设您希望某些开发人员能够删除项目,这将阻止开发人员角色中的任何人放弃任何上述安全性。您可以直接将此权限应用于用户,但如果您希望它们能够删除表或列,而不是视图,那么它也将无效。

另一种方法是将所有视图移动到单独的模式中,然后拒绝该模式上的用户DELETE:

USE [dbName]
GO
DENY DELETE ON SCHEMA::[viewsSchema] TO [developerRole]
GO

这里的问题是它很乱,并不是最好的模式使用,不是我想要的选择。

我认为最好的选择确实是一个触发器,如果​​真的只有一个用户,你可以做到以下几点:

CREATE TRIGGER noViewDrop
ON DATABASE
FOR DROP_VIEW
AS
IF USER_ID() = USER_ID('Bob')
    BEGIN
        PRINT 'Bob Can''t Drop Views';
        ROLLBACK
    END

这意味着Bob无法删除数据库中的任何视图,但可以删除上面列出的任何其他安全性。如果要将其应用于数据库角色而不是单个用户,只需使用IS_ROLEMEMBER()函数,如下所示:

CREATE TRIGGER noViewDrop
ON DATABASE
FOR DROP_VIEW
AS
IF IS_ROLEMEMBER ('developerRole') = 1
    BEGIN
        PRINT 'Members of the developerRole Can''t Drop Views';
        ROLLBACK
    END

意味着在删除视图时,开发人员角色中的任何人都会被触发器捕获,但如果他们需要删除列,他们仍然可以执行此操作。任何不在developerRole中的人仍然可以删除视图。

答案 1 :(得分:0)

触发

CREATE TRIGGER NO_DROP_VIEW
ON DATABASE
FOR DROP_VIEW
AS
PRINT 'Dropping VIEWs are not allowed'
ROLLBACK

答案 2 :(得分:-1)

要拒绝删除视图,您只需添加DENY DELETE

即可
use Your_Database
GO
DENY DELETE TO [SQLUserTest]
GO

当用户被拒绝DELETE权限时,该用户将无法再删除或删除该数据库中的任何对象。