设置SQLServer数据库中某些表为只读的多种方法分享
create table tblEvents
)
UPDATE,
The statement has been terminated.
create table tblEvents
任何对表的DML操作都会被拒绝,并返回以下错误信息:
复制代码 代码如下:
ROLLBACK TRANSACTIONDENY INSERT, UPDATE, DELETE ON tblEvents TO Public
INSTEAD OF
id int,
END
可以通过DCL命令控制用户权限,但此步无法限制高级权限用户(如system admin,DatabaseOwner):
The UPDATE statement conflicted with the CHECKconstraint "chk_read_only_tblEvent". The conflict occurred indatabase "MyDB", table "dbo.tblEvents".
ALTER DATABASE [MyDB] MODIFY FILEGROUP [READ_ONLY_TBLS] READONLY
BEGIN
GO
CREATE TRIGGER trReadOnly_tblEvents ON tblEvents
如果一个表总是只读,那么你应该放到只读文件组中。
3. 设置数据库为只读
create database MyDB
使用 Check 约束和Delete 触发器:
复制代码 代码如下:
首先,先禁用在上一步创建的触发器:disable trigger trReadOnly_tblEvents on tblevents然后,添加约束:ALTER TABLE tblEvents WITH NOCHECK ADD CONSTRAINT chk_read_only_tblEvent CHECK( 1 = 0 )执行以后,无论你执行任何一个INSERT/UPDATE语句,都将提示以下错误信息:复制代码 代码如下:
Msg 50000, Level 16, State 1, Procedure trReadOnly_tblEvents, Line 7tblEvents table is read only.Msg 3609, Level 16, State 1, Line 1The transaction ended in the trigger. The batch has been aborted.id int,
把表放到只读文件组:
可以在一个只读文件组中创建一个表:
ALTER DATABASE [MyDB] SET READ_ONLY WITH NO_WAIT
一般情况下会有几种情况需要你把数据库设为只读:
ALTER DATABASE [MyDB] ADD FILEGROUP [READ_ONLY_TBLS]
The index "" for table "dbo.tblEvents" (RowsetId 72057594038845440) resides on a read-only filegroup ("READ_ONLY_TBLS"), which cannot be modified.
请注意这里使用的是INSTEADOF trigger,因为如果你使用了AFTER trigger,会在执行DELETE, UPDATE和INSERT语句时请求锁,会对写事务日志和回滚操作造成性能上的影响
AS
union all
4. 把表放到只读文件组中
6. 创建视图
ROLLBACK TRANSACTION
as
创建视图
1. Insert,Update,Delete 触发器
为了替代直接访问表,可以使用视图:
logEvent varchar(1000)
USE [master]
确认是否有必要用这些步骤来设置表为只读。
DELETE
最后一步:
DENY INSERT, UPDATE, DELETE ON tblEvents TO Jugal
GO
2. Check 约束 和 Delete 触发器
CREATE TRIGGER trReadOnlyDel_tblEvents ON tblEvents
复制代码 代码如下:
DROP table tblEvents复制代码 代码如下:
insert into tblEventsMsg 4406, Level 16, State 1, Line 1Update or insert of view or function 'vwtblEvents1' failed because it contains a derived or constant field.Msg 4426, Level 16, State 1, Line 1View'vwtblEvents1' is not updatable because the definition contains a UNIONoperator.
在开始之前,先创建一个数据库及表作为示例:
INSTEAD OF INSERT,
select ID, Logevent from tblEvents
现在先在表中添加一个check 约束“1=0”,意味着总是失败。它禁止你在任何行执行INSERT或者Delete操作。
(
当用户执行insert/update/delete时,将提示以下错误:
设置数据库为只读:
复制代码 代码如下:
(BEGIN
5. 拒绝对象级别权限
但是,该约束不会对DELETE操作造成影响,为此,需要再创建一个DDL触发器:
复制代码 代码如下:
ENDDELETE
RAISERROR( 'tblEvents table is read only.', 16, 1 )
GO
values (1, 'Password Changed'), (2, 'User Dropped'), (3, 'Finance Data Changed')
RAISERROR( 'tblEvents table is read only.', 16, 1 )
GO
logEvent varchar(1000)
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'mydb_readonly_tables', FILENAME = N'C:\JSPACE\myDBReadOnly.ndf' , SIZE = 2048KB , FILEGROWTH = 1024KB ) TO FILEGROUP [READ_ONLY_TBLS]
)
你可以设置数据库为只读,这样就禁止对整个数据库的DDL/DML操作。可以使用以下语句:
拒绝对象级别权限
ON [READ_ONLY_TBLS]
当一个用户尝试通过INSERT/UPDATE/DELETE操作数据时,将得到以下错误信息:
Msg 547, Level 16, State 0, Line 1
GO
AS
USE [master]
在这个视图中,使用了UNION,只有在你确保有对应数量的列时才使用。在这个例子中,表有两列,所以使用两个输出列。同时,你也应该确保数据类型也一致。
create view vwtblEvents
Msg 652, Level 16, State 1, Line 1
select 0, '0' where 1=0
相关热词: 方法
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/mssql/1989.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
