【发布时间】:2011-02-01 13:23:07
【问题描述】:
我正在更新该表中的一些记录集,之后我需要将该表设为只读。
那么如何在 SQL Server 中将表设为只读?
【问题讨论】:
-
这里有几个很好的答案。我的问题是:该表必须为谁只读?系统管理员总是有权做任何事情,尽管这可能需要他们时间和精力。
-
系统管理员用户以外的用户
标签: sql sql-server sql-server-2005
我正在更新该表中的一些记录集,之后我需要将该表设为只读。
那么如何在 SQL Server 中将表设为只读?
【问题讨论】:
标签: sql sql-server sql-server-2005
一个简单的替代方案,它会阻止特定表的更新和插入,但仍允许删除:
ALTER TABLE mytable WITH NOCHECK ADD CONSTRAINT chk_read_only CHECK( 1 = 0 )
注意:这避免了 INSERT 和 UPDATE,但允许 DELETE。
如果您真的需要一个真正只读的表格,您也可以:
a) 将其放入自己的数据库中或
b) 将其放在一个文件组中并将其标记为只读,方法如下:
USE [master]
GO
ALTER DATABASE [csvtosp] ADD FILEGROUP [READONLYTABLES]
GO
ALTER DATABASE [csvtosp] ADD FILE ( NAME = N'mydb_readonly_tables', FILENAME = N'G:\SQL2005DATA\mydb_readonly_tables.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [READONLYTABLES]
GO
USE csvtosp
GO
DROP TABLE mytable
CREATE TABLE mytable (
somedata char(8000) not null
) ON READONLYTABLES
GO
有关此主题的更多详细信息,请访问此处:
【讨论】:
ALTER DATABASE [csvtosp] MODIFY FILEGROUP [READONLYTABLES] READONLY
READONLYTABLES 不是 READONLY 2。无需删除表即可将其移动到另一个文件组。您只需要重新创建聚集索引。
3 号可能是最佳实践。例如,如果您的连接是 db_owner,则触发器可以禁用触发器或将表移动到不同的文件组。
【讨论】:
如果您希望它对公众只读,但仍希望能够在以后编辑该表,您可能需要考虑为该数据库创建多个用户并授予该数据库不同的权限 - 理想情况下无论如何,您都应该这样做,并且不允许公众访问更改表、截断等。
【讨论】: