我使用SQL Server 2008 R2
并且想要拒绝删除任何开发者角色的视图。
如何添加拒绝权限以删除此角色的任何视图。
按数据库触发可以防止删除所有用户的任何视图。
答案 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
权限时,该用户将无法再删除或删除该数据库中的任何对象。