标签归档:NOTRUNCATE

mssql sql server禁掉truncate table命令(权限)的方法


摘要:
下文讲述,我们公司最近在数据库的健康检查中,老板提出:“必须禁止数据库的truncate命令”的变相实现方法。
实验环境:sql server 2008 R2


我们深知 “truncate table”权限的以下信息:
1.“表所有者、sysadmin、db_owner、db_ddladmin这几个角色都拥有 TRUNCATE TABLE 删除,避免无法修改这些角色的权限”
2.truncate table 可以快速删除一张大表,并且无相关的日志信息记载
3.truncate table无法运行在以下的设置情况上:
3.1 拥有外键约束的数据表
3.2 使用事务复制和合并复制发布的数据表
综上所述:我们可以发现truncate table在企业中是一个非常危险的sql命令,通过我们在sql命令审计中,都对此命令进行了多级审核或禁止,下文将通过举例的方式讲述,在sqlserver层面,变相的实现“禁止truncate table”命令运行的方法。



实现思路:
我们可以使用truncate table 无法运行在拥有外键约束的表上的这个特性,对数据表进行相关设置,使其无法运行truncate table,避免出现一些异常操作

例:

  /*
设置一个基础表,设置其外键指向禁止使用truncate命令的数据表的主键
*/

create table baseMain(keyId int primary key)
go


create table [maomao365.com]
(keyId int identity primary key,info varchar(10),
fBaseMainKeyId int )
go


alter table  baseMain
add constraint id_fbaseKeyId
  foreign key (keyId) references [maomao365.com](keyId)
  go


  insert into [maomao365.com]
  (info,fBaseMainKeyId)values('test',1),
  ('test2',2)
  go

  insert into baseMain(keyId)values(1)
go


truncate table [maomao365.com]
 
mssql_sqlserver_变相禁用truncate命令的方法

mssql_sqlserver_变相禁用truncate命令的方法

mssql数据库收缩NOTRUNCATE同TRUNCATEONLY区别


摘要:
下文讲述数据库收缩中的可用选项:NOTRUNCATE,TRUNCATEONLY的区别及注意事项,如下所示:
实验环境:sqlserver 2008 R2



NOTRUNCATE

数据库收缩命令中,如果使用NOTRUNCATE时,代表sqlserver从最后页移动到前页,找到页中空闲的未分配空间,数据文件大小不收缩,但是将数据中未分配空间放入数据文件的尾部。

TRUNCATEONLY

使用收缩命令时,使用TRUNCATEONLY选项,
SQL Server从末尾到开始,只要在文件末尾有空的可用空间,就会把数据文件清理掉。
使用此选项SQL Server在数据文件里页不会进行移动。



数据库文件正确的收缩步骤:

1.使用notruncate 扫描所有空闲页,将其移动到数据库文件末尾
2.使用TRUNCATEONLY 进行收缩,移除末尾的空闲部分

注意事项:
使用TRUNCATEONLY对数据文件收缩将开销小,更安全,不会产生索引碎片;
使用notruncate,sqlserver 会移动数据所存储的页,会带来严重的索引碎片。