oracle sql语句 只读,将SQL中几张表设为只读,这是什么奇怪需求?

点击关注上方“SQL数据库开发”,

设为“置顶或星标”,第一时间送达干货

最近接到一个奇怪的需求,要将SQL Server中的几张表设为只读。我的第一反应就是直接将用户设为只读权限就好了,但是仔细一想又不是那么回事。

创建只读账号

SQL Server的只读账号是针对某个具体的数据库,设置的方法很简单:

进入Sqlserver Management Studio(MSSQL客户端)

选择安全性->登录名->右键新建登录名

在常规里输入用户名和密码

在"用户映射"里“映射到此登录名的用户”选择该用户可以操作的数据库

在“数据库角色成员身份”里选择"db_datareader",

这样一个只读用户就创建完成了。

461a76d940f2aab7a664d30d1cf5d908.png

但是这样会造成所有的表都变成只读,这与需求不符。

那该怎么办呢?今天就告诉大家几种常见的方法。

1、使用触发器限制单表只读

有如下一张创建好的表Teacher

dc44cf23324c33f49500aa805c6b210b.png

我们先往里面插入一条数据来证明它是可写的。

INSERT INTO Teacher VALUES('04','马六');

再查下一下表里面的结果,看是否写进去了。

d948b0600a226649a82d32e8163e87de.png

证明该表是可写的,下面我们开始新建一个触发器将其设为只读。

CREATE TRIGGER trReadOnly_Teacher ON Teacher    INSTEAD OF INSERT,UPDATE,DELETE  AS  BEGIN      RAISERROR( 'tblEvents table is read only.',16, 1 )    ROLLBACK TRANSACTION  END

(提示:可以左右滑动代码)

创建完成后,我们再往Teacher里面写数据或删数据

INSERT INTO Teacher VALUES('05','赵七');DELETE FROM Teacher TID='04';

结果会报如下错误提示:

8d50d801ea613d96b6ca20a71845507d.png

证明我们设置的触发器生效了。

虽然我们一般不提倡在数据库中使用触发器,因为触发器会造成有很多性能上的影响,但是如果用来控制权限还是可以的。

此外该方法只针对少量需要设置为只读的表,如果需要设置表比较多就不太合适了。

如果要禁用该触发器也很简单,使用如下代码即可:

disable trigger trReadOnly_Teacher on Teacher

2、创建只读文件组

先创建一个只读文件组

--创建文件组READ_ONLY_TBLSALTER DATABASE School ADD FILEGROUP [READ_ONLY_TBLS]GO  ALTER DATABASE School ADD FILE (NAME =N'School_readonly_tables',FILENAME = N'D:\Temp\SchoolReadOnly.ndf' ,SIZE =2048KB ,FILEGROWTH = 1024KB) TO FILEGROUP [READ_ONLY_TBLS]

然后将要设为只读的文件先插入临时表再删除

SELECT * INTO #Teacher FROM TeacherDROP TABLE Teacher

然后创建刚被删除的表名,再将临时表里面的数据插入进去,最后将文件组设为只读即可

CREATE TABLE Teacher(TID VARCHAR(10),TName varchar(100))ON [READ_ONLY_TBLS]INSERT INTO TeacherSELECT * FROM #Teacher--将数据库的文件组设为只读ALTER DATABASE School MODIFY FILEGROUP[READ_ONLY_TBLS] READONLY

下面我们试着往Teacher里面插入数据:

INSERT INTO Teacher VALUES('05','赵七');

结果如下:

e96957cd6883d524eb7eea52b6d0a06d.png

证明也是不可写的。

这种方法相比触发器复杂一点,但是可以大批量的设置,前提是要备份好数据。

3、拒绝对象级别的操作

可以通过DCL命令控制用户权限,但此步无法限制高级权限用户(如system admin,DatabaseOwner)

DENY INSERT, UPDATE, DELETE ON tblEvents TO TestDENY INSERT, UPDATE, DELETE ON tblEvents TO Public

4、创建视图

为了替代直接访问表,可以使用视图:

CREATE VIEW V_SCAS  SELECT SID,CID,Score FROM SCUNION ALLSELECT '0', '0',0 WHERE 1=0

当我们要删除视图中的数据时

DELETE FROM V_SC WHERE score=30.0

会得到如下提示:

67095873d20dc0d2482d087c0b8167d5.png

如果不加UNION ALL,正常的视图是可以删除数据的。

以上就是几种常见的将表设为只读的方法,可以根据自身实际需求进行选择。

——End——

后台回复关键字:1024,获取一份精心整理的技术干货

后台回复关键字:进群,带你进入高手如云的交流群。

推荐阅读

这是一个能学到技术的公众号,欢迎关注

点击「

阅读原文

」了解SQL训练营

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值