В качестве обходного пути вы можете создать триггер DDL базы данных, который не позволяет этому пользователю создавать, отбрасывать или изменять какие-либо таблицы или определенные таблицы.
ALTER TRIGGER [TR_ProtectTables]
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE, CREATE_TABLE
AS
DECLARE @eventData XML,
@uname NVARCHAR(50),
@sname NVARCHAR(100),
@oname NVARCHAR(100),
@otext VARCHAR(MAX),
@etype NVARCHAR(100),
@edate DATETIME
SET @eventData = eventdata()
SELECT
@edate=GETDATE(),
@uname=@eventData.value('data(/EVENT_INSTANCE/UserName)[1]', 'SYSNAME'),
@sname=@eventData.value('data(/EVENT_INSTANCE/SchemaName)[1]', 'SYSNAME'),
@oname=@eventData.value('data(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME'),
@otext=@eventData.value('data(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'VARCHAR(MAX)'),
@etype=@eventData.value('data(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')
IF @oname IN ('tblBananas','tblApples','tblOranges') and @uname = 'UserName'
BEGIN
DECLARE @err varchar(100)
SET @err = 'Table ' + @sname + '.' + @oname + ' is super duper protected and cannot be dropped.'
RAISERROR (@err, 16, 1) ;
ROLLBACK;
END
GO
ENABLE TRIGGER [TR_ProtectTables] ON DATABASE
GO
Чтобы пользователь не мог вставить INSERT / UPDATE /УДАЛИТЕ любые данные, для которых вы можете создать роль и добавить пользователя к этой роли.
CREATE ROLE [DenyWriteOnly]
EXEC sp_addrolemember N'db_datareader', N'DenyWriteOnly'
--explicitly DENY access to writing
EXEC sp_addrolemember N'DB_DenyDataWriter', N'DenyWriteOnly'
--now add the user to the role
EXEC sp_addrolemember N'DenyWriteOnly', N'MyDomain\YourUser'
Я вижу, что вы отредактировали свой исходный вопрос и хотите также запретить таблицу усечений. Проще всего запретить пользователю усекать любую таблицу - включить сбор данных об изменении, но эта функция доступна для управляемого экземпляра Azure.
Если у вас нет управляемого экземпляра Azure, решение будет более сложным, посколькуминимальное разрешение, требуемое для TRUNCATE, - ALTER. Другими вариантами являются создание таблиц для участия в репликации транзакций, включение таблиц в индексированные представления или создание пустой таблицы просто с целью создания фиктивного внешнего ключа для каждой таблицы, ссылающейся на пустую таблицу.