数据库只读,但只有少数表可写

Dev*_*per 9 sql database sql-server sql-server-2008-r2

我试图使用以下命令将数据库设置为只读模式,它可以工作.

ALTER DATABASE [TESTDB] SET READ_ONLY WITH NO_WAIT
Run Code Online (Sandbox Code Playgroud)

但是,我需要只允许像UserSession等几个表可写.可能吗?

我们在数据库中有大约500个表,我们只需要允许4个表可写.

Hor*_*ria 5

你可以否认INSERT,UPDATE,DELETEpublic喜欢的角色:

DENY UPDATE ON tab1 TO public 
DENY INSERT ON tab1 TO public 
DENY DELETE ON tab1 TO public 
Run Code Online (Sandbox Code Playgroud)

之后,常规用户(不是系统管理员)在尝试插入tab1时会出错:

INSERT INTO tab1 (id) VALUES (1)

--Msg 229, Level 14, State 5, Line 20
--The INSERT permission was denied on the object 'tab1', database 'test', schema 'dbo'.
Run Code Online (Sandbox Code Playgroud)

如果这是您愿意添加到数据库的东西,那么您可以生成脚本来更改所有表,如:

EXEC sp_msforeachtable '
PRINT ''
    DENY UPDATE ON ? TO public 
    DENY INSERT ON ? TO public 
    DENY DELETE ON ? TO public
''
'
Run Code Online (Sandbox Code Playgroud)

确保您不会拒绝写入仍需要写入的4个表.

不确定您的应用程序,但如果您不想拒绝public角色权限,您可能会考虑创建自己的角色,拒绝访问该角色,并让用户成为该角色的一部分.

希望它有意义.


Gor*_*off 5

我的建议是将两种类型的表存储在不同的模式中 - 比如说readablewritable.

当SQL Server在2005年引入模式时,我们的想法是模式是安全的单元,数据库是备份和恢复的单元:

Microsoft SQL Server 2005引入了数据库对象模式的概念.模式类似于用于存储数据库对象的单独名称空间或容器.安全权限适用于模式,使其成为基于访问权限分离和保护数据库对象的重要工具.

这将使两种不同的模式成为您的数据架构的有力竞争者.

换句话说,将readable架构设置为read_only.并将其他表放在writable架构中.