sqlserver数据库只读权限里的某几张表是只读的怎么取消只读?

最近接到一个奇怪的需求,要将SQL Server中的几张表设为只读。我的第一反应就是直接将用户设为只读权限就好了,但是仔细一想又不是那么回事。创建只读账号SQL Server的只读账号是针对某个具体的数据库,设置的方法很简单:进入Sqlserver Management Studio(MSSQL客户端)选择安全性->登录名->右键新建登录名在常规里输入用户名和密码在"用户映射"里“映射到此登录名的用户”选择该用户可以操作的数据库在“数据库角色成员身份”里选择"db_datareader",这样一个只读用户就创建完成了。但是这样会造成所有的表都变成只读,这与需求不符。那该怎么办呢?今天就告诉大家几种常见的方法。1、使用触发器限制单表只读有如下一张创建好的表Teacher我们先往里面插入一条数据来证明它是可写的。<pre language="typescript" code_block="true">INSERT INTO Teacher VALUES('04','马六');</pre>再查下一下表里面的结果,看是否写进去了。证明该表是可写的,下面我们开始新建一个触发器将其设为只读。<pre language="typescript" code_block="true">CREATE TRIGGER trReadOnly_Teacher ON Teacher
INSTEAD OF INSERT,UPDATE,DELETE
AS
BEGIN
RAISERROR( 'tblEvents table is read only.',16, 1 )
ROLLBACK TRANSACTION
END</pre>(提示:可以左右滑动代码)创建完成后,我们再往Teacher里面写数据或删数据<pre language="typescript" code_block="true">INSERT INTO Teacher VALUES('05','赵七');
DELETE FROM Teacher TID='04';</pre>结果会报如下错误提示:![image](https://upload-images.jianshu.io/upload_images/22570485-fcbcdb45ba0a302f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)证明我们设置的触发器生效了。虽然我们一般不提倡在数据库中使用触发器,因为触发器会造成有很多性能上的影响,但是如果用来控制权限还是可以的。此外该方法只针对少量需要设置为只读的表,如果需要设置表比较多就不太合适了。如果要禁用该触发器也很简单,使用如下代码即可:<pre language="typescript" code_block="true">disable trigger trReadOnly_Teacher on Teacher</pre>2、创建只读文件组先创建一个只读文件组<pre language="typescript" code_block="true">--创建文件组READ_ONLY_TBLS
ALTER DATABASE School ADD FILEGROUP [READ_ONLY_TBLS]
GO
ALTER DATABASE School ADD FILE (
NAME =N'School_readonly_tables',
FILENAME = N'D:TempSchoolReadOnly.ndf' ,
SIZE =2048KB ,
FILEGROWTH = 1024KB
) TO FILEGROUP [READ_ONLY_TBLS]</pre>然后将要设为只读的文件先插入临时表再删除<pre language="typescript" code_block="true">SELECT * INTO #Teacher FROM Teacher
DROP TABLE Teacher</pre>然后创建刚被删除的表名,再将临时表里面的数据插入进去,最后将文件组设为只读即可<pre language="typescript" code_block="true">CREATE TABLE Teacher
(
TID VARCHAR(10),
TName varchar(100)
)
ON [READ_ONLY_TBLS]
INSERT INTO Teacher
SELECT * FROM #Teacher--将数据库的文件组设为只读ALTER DATABASE School MODIFY FILEGROUP[READ_ONLY_TBLS] READONLY</pre>下面我们试着往Teacher里面插入数据:<pre language="typescript" code_block="true">INSERT INTO Teacher VALUES('05','赵七');</pre>结果如下:证明也是不可写的。这种方法相比触发器复杂一点,但是可以大批量的设置,前提是要备份好数据。3、拒绝对象级别的操作可以通过DCL命令控制用户权限,但此步无法限制高级权限用户(如system admin,DatabaseOwner)<pre language="typescript" code_block="true">DENY INSERT, UPDATE, DELETE ON tblEvents TO Test
DENY INSERT, UPDATE, DELETE ON tblEvents TO Public</pre>4、创建视图为了替代直接访问表,可以使用视图:<pre language="typescript" code_block="true">CREATE VIEW V_SC
AS
SELECT SID,CID,Score FROM SC
UNION ALL
SELECT '0', '0',0 WHERE 1=0</pre>当我们要删除视图中的数据时<pre language="typescript" code_block="true">DELETE FROM V_SC WHERE score=30.0</pre>会得到如下提示:如果不加UNION ALL,正常的视图是可以删除数据的。以上就是几种常见的将表设为只读的方法,可以根据自身实际需求进行选择。
}

我要回帖

更多关于 sqlserver数据库只读权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信