如何创建一个可以创建/更改/删除视图但不能创建表,可以读取数据但不能插入/更新/删除/截断数据的Azure SQL数据库用户?

是否可以创建一个可以执行以下操作的Azure SQL数据库用户

  • 针对所有表和视图进行选择
  • 创建/更改/删除视图

但是用户应该具有以下权限:

  • 对任何表或视图执行INSERT / UPDATE / DELETE / TRUNCATE TABLE
  • 创建/更改/删除任何表

满足以上要求的正确语句是什么,或者在Azure SQL中是不可能的?

我尝试了以下语句,没有最后一条语句,用户无法创建视图,但是添加最后一条语句,用户可以删除表。

CREATE USER [TestUser] WITH PASSWORD=N'NAvCO_h2eMuX',DEFAULT_SCHEMA=[dbo];

CREATE ROLE [TestRole];

ALTER ROLE [TestRole] ADD MEMber [TestUser];

ALTER ROLE [db_datareader] ADD MEMber [TestRole];

GRANT CREATE VIEW TO [TestRole];

GRANT SELECT ON SCHEMA :: dbo TO [TestRole];

GRANT ALTER ON SCHEMA :: dbo TO [TestRole];
evilor110 回答:如何创建一个可以创建/更改/删除视图但不能创建表,可以读取数据但不能插入/更新/删除/截断数据的Azure SQL数据库用户?

运行ALTER ROLE [db_datareader] ADD MEMBER [TestRole]GRANT SELECT ON SCHEMA :: dbo TO [TestRole]时,用户[TestUser]将成为数据库的只读角色db_datareader。您不能执行任何其他操作,例如“对任何表或视图执行INSERT / UPDATE / DELETE”。

但是您将ALTER权限添加到[TestUser],用户将同时具有SELECTALTER权限,用户将成为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

大家都在问