我正在尝试使用以下命令将数据库设置为只读模式,并且它可以正常工作。
ALTER DATABASE [TESTDB] SET READ_ONLY WITH NO_WAIT
但是,我只需要允许像UserSession等几个表可写。 有可能吗?
我们在数据库中有大约500个表,我们只需要允许4个表可写。
答案 0 :(得分:5)
您可以拒绝INSERT
,UPDATE
,DELETE
到public
角色:
DENY UPDATE ON tab1 TO public
DENY INSERT ON tab1 TO public
DENY DELETE ON tab1 TO public
之后,普通用户(不是系统管理员)在尝试插入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'.
如果您愿意添加到数据库中,那么您可以生成脚本来更改所有表格,如:
EXEC sp_msforeachtable '
PRINT ''
DENY UPDATE ON ? TO public
DENY INSERT ON ? TO public
DENY DELETE ON ? TO public
''
'
确保您不会拒绝写入仍然需要写入的4个表。
不确定您的应用程序,但如果您不想拒绝public
角色的权限,您可能会考虑创建自己的角色,拒绝访问该角色,并让用户成为该角色的一部分。< / p>
希望它有意义。
答案 1 :(得分:5)
我的建议是将两种类型的表存储在不同的模式中 - 比如readable
和writable
。
当SQL Server在2005年引入模式时,idea是模式是安全的单位,数据库是备份和恢复的单位:
Microsoft SQL Server 2005引入了数据库对象的概念 模式。模式类似于单独的命名空间或容器 用于存储数据库对象。安全权限适用于模式, 使它们成为分离和保护数据库的重要工具 基于访问权限的对象。
这将使两种不同的模式成为您数据架构的有力竞争者。
换句话说,将readable
架构设置为read_only
。并将其他表放在writable
架构中。
答案 2 :(得分:4)
您可以通过将可写表移动到单独的文件组并将其他文件组设置为只读来存档。
第一步 - 创建不同的文件组
ALTER DATABASE TESTDB ADD FILEGROUP Writable_FG;
第二步 - 将数据文件添加到新文件组
ALTER DATABASE TESTDB ADD FILE (
NAME = JeanAnn2,
FILENAME = 'D:\MSSQL\TESTDB_Writable_FG_01.ndf',
SIZE = 6MB,
MAXSIZE = 18MB,
FILEGROWTH = 1
) TO FILEGROUP Writable_FG;
第三步 - 将需要写入的表格移动到新文件组
为此,您需要在新文件组上重新创建表的聚簇索引。
CREATE CLUSTERED INDEX CIX_YourTable
ON dbo.YourTable(YourClusteringKeyFields)
WITH DROP_EXISTING
ON [Writable_FG]
或者您的聚集索引唯一:
CREATE UNIQUE CLUSTERED INDEX CIX_YourTable
ON dbo.YourTable(YourClusteringKeyFields)
WITH DROP_EXISTING
ON [Writable_FG]
对您需要写入的所有四个表执行此操作。
第四步 - 将其他文件组设为只读
ALTER DATABASE TESTDB MODIFY FILEGROUP [PRIMARY] READ_ONLY;
此处假设其他文件组是主文件。
答案 3 :(得分:0)
您可以使用以下内容:
ALTER TABLE [schemaName].[tableName] READ ONLY ON|OFF
答案 4 :(得分:0)
您可以在数据库上创建新架构,例如upd
现在你可以给阅读&amp;为应该具有修改数据能力的特定用户写入该模式的权限。
之后,您可以根据要更新的表创建可更新/可插入的视图
create view upd.Tab1
as
select * from dbo.Tab1
GO
对于拥有upd
架构权限的用户,只有架构upd
中的对象才可写。
答案 5 :(得分:0)
您可以将4个表放在不同的数据库和数据库上 将数据库的同义词放在您想要更新的4个表中。
CREATE SYNONYM sessionTables
SELECT *
FROM WriteableDatabase.dbo.sessionTables