限制在SQL Server中删除列的权限?

时间:2016-06-08 18:40:34

标签: sql sql-server

ALTER TABLE [dbo].[Client] ADD [Awesomness] [nvarchar](max)
ALTER TABLE [dbo].[Client] DROP COLUMN [Awesomness]

第二个命令我不想成功,我不希望任何DROP COLUMN成功。所以我为我的数据库创建了一个用户,只是想知道如何拒绝该用户DROP COLUMN的权限。我设置了一个触发器,但似乎没有照顾DROP COLUMN。无论如何我可以限制这个吗?

CREATE TRIGGER [TR_DB_NO_DROPPING_OBJECTS_2]
on DATABASE
FOR 
DROP_PROCEDURE,DROP_FUNCTION,DROP_VIEW,DROP_TABLE, DROP_DEFAULT,DROP_EXTENDED_PROPERTY
AS
 BEGIN
    IF  --only two accounts allowed to drop stuff
   suser_name() NOT IN('test' )

 BEGIN
 --raise an error, which goes to the error log
 RAISERROR('Unauthorized use of drop object from inpermissible host.', 16, 1)
 --prevent the drop
  ROLLBACK
    END
 --if it got to here, it was the "right" user from the "right" machine (i hope)
 END

我为用户分配的角色。

use Hasan
go
EXEC sp_addrolemember N'db_datareader', N'TestUser'
go

use Hasan
go
EXEC sp_addrolemember N'db_datawriter', N'TestUser'
go

use Hasan
GO
GRANT EXECUTE TO [TestUser]
GO

use Hasan
GO
GRANT INSERT TO [TestUser]
GO

use Hasan
GO
GRANT SELECT TO [TestUser]
GO

use Hasan
GRANT ALTER TO [TestUser]
GO

use Hasan
GO
GRANT UPDATE TO [TestUser]
GO

use Hasan
GO
GRANT DELETE TO [TestUser]
GO

1 个答案:

答案 0 :(得分:0)

这将是一个Alter_Table DDL事件。看看它是否适合你。

另外,我不确定你是否考虑过角色。授予dbwriter和dbreader允许CRUD操作但不更改DDL。

https://msdn.microsoft.com/en-us/library/ms189121.aspx

编辑: 此示例不检查用户,但它适用于我的测试表:

CREATE TRIGGER testtrig 
ON Database 
FOR alter_table 
AS 
    Declare @Msg nvarchar(max) = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'))
     If @Msg Like '%Drop Column ColumnA%'
     Rollback
GO

可能有一种比解析消息文本更好的方法,就像在我的例子中一样,这只是一个快速测试。

另外请记住,这只是让用户知道他们不应放弃此列的安全措施。如果他们有DDL权限,他们可以禁用或删除触发器。