运行ALTER ROLE [db_datareader] ADD MEMBER [TestRole]
或GRANT SELECT ON SCHEMA :: dbo TO [TestRole]
时,用户[TestUser]
将成为数据库的只读角色db_datareader
。您不能执行任何其他操作,例如“对任何表或视图执行INSERT / UPDATE / DELETE”。
但是您将ALTER
权限添加到[TestUser]
,用户将同时具有SELECT
和ALTER
权限,用户将成为db_owner
之类的角色。当然,它有权创建视图或删除表。
不可能创建同时具有只读权限和CREATE VIEW
权限的Azure SQL数据库用户。
参考:Database-Level Roles
希望这会有所帮助。
,
作为一种解决方法,您可以创建一个数据库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]',@oname=@eventData.value('data(/EVENT_INSTANCE/ObjectName)[1]',@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 / DELETE任何数据,您可以为此创建一个Role并将用户添加到该角色。
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。其他选择包括使表参与事务复制,使表成为索引视图的一部分或仅出于在引用空表的每个表上创建虚拟外键的目的而创建空表。
本文链接:https://www.f2er.com/3119827.html