2016-06-08 77 views
0
ALTER TABLE [dbo].[Client] ADD [Awesomness] [nvarchar](max) 
ALTER TABLE [dbo].[Client] DROP COLUMN [Awesomness] 

第二個命令我不想成功,我不希望任何DROP COLUMN成功。所以我爲我的數據庫創建了一個用戶,只是想知道如何拒絕這個用戶的許可DROP COLUMN。我設置了一個觸發器,但似乎沒有照顧DROP COLUMN。反正我有限制嗎?限制在SQL Server中刪除列的權限?

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 

回答

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權限,他們可以禁用或刪除觸發器。

+0

如果我限制Alter_Table事件,是否也會限制'ALTER TABLE [dbo]。[Client] ADD [Awesomne​​ss] [nvarchar](max)'?此外,我給了我的用戶dbwriter和dbreader角色,但用戶仍然可以刪除列。 – chillax786

+0

我剛剛創建了一個測試帳戶,如果帳戶只有dbwriter和dbreader,我無法刪除一列。您的用戶必須具有像系統管理員一樣的登錄設置,或者可能是具有所需權限的組的一部分。正如你所說,這將拒絕添加或刪除列的能力,創建表/視圖等。如果您想允許用戶進行其他DDL更改,那麼在Alter_Table中使用觸發器可能是您的最佳選擇。 –

+0

謝謝!我嘗試在我的觸發器中添加Alter_Table,但仍然可以放置列......對此的任何想法? – chillax786