禁止删除表

数据库交付后,担心用户将系统运行的关键表误删除,打算控制起来,禁止用户对表等对象的删除。

有没有良策。

权限交付的是最大的,从权限控制不能实现,有没有其他的好的方式。
...全文
204 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
水族杰纶 2008-11-07
  • 打赏
  • 举报
回复
學習~~
wonsoft 2008-11-07
  • 打赏
  • 举报
回复
SQL Server 2005支持。


USE mydb
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE
AS
RAISERROR('没有删除表的权限.', 10, 1)
PRINT '尝试在数据库' + DB_NAME() + '中删除表.'
PRINT CONVERT (nvarchar (1000),EventData())
ROLLBACK
GO

CREATE TABLE TestDROP(col1 INT)
GO
INSERT INTO TestDROP VALUES(1)
DROP TABLE testdrop


/* ========================== */
DROP TRIGGER safety
ON DATABASE
GO

DROP TABLE testdrop
等不到来世 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gaojier1000 的回复:]
关键是有的表可以drop掉重新创建,我要控制部分表,应该怎么实现?
[/Quote]
看11楼 ^_^
  • 打赏
  • 举报
回复
关键是有的表可以drop掉重新创建,我要控制部分表,应该怎么实现?
等不到来世 2008-11-07
  • 打赏
  • 举报
回复
USE test
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tri_avoidDrop')
DROP TRIGGER tri_avoidDrop ON DATABASE
GO
CREATE TRIGGER tri_avoidDrop
ON DATABASE
FOR DROP_TABLE
AS
--指定某些表不能被drop
if eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)') in ('tb','ta','temp')
begin
PRINT '此表内有数据嘿,别jb乱删!'
ROLLBACK
end
GO

--测试:
create table tb(id int)
create table tc(id int)

drop table tb
/*
表内有数据嘿,别jb乱删!
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/
drop table tc
/*
Command(s) completed successfully.
*/

DROP TRIGGER tri_avoidDrop ON DATABASE
GO
cxmcxm 2008-11-07
  • 打赏
  • 举报
回复
建数据库角色,将其设为不允许修改,创建,移除表.
创建用户,将角色权限赋给用户.
-----------------------

不过,数据库在用户那里.用户想删除就删除.
预先将各种数据安全性的事告知用户就行了.
用户自己将硬盘格式化,那是用户自己的事,你又如何能阻止得了.

等不到来世 2008-11-07
  • 打赏
  • 举报
回复
USE test
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tri_avoidDrop')
DROP TRIGGER tri_avoidDrop ON DATABASE
GO
CREATE TRIGGER tri_avoidDrop
ON DATABASE
FOR DROP_TABLE
AS
PRINT '表内有数据嘿,别jb乱删!'
ROLLBACK
GO

--测试:
create table tb(id int)
drop table tb

/*
表内有数据嘿,别jb乱删!
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/

DROP TRIGGER tri_avoidDrop ON DATABASE
GO
hyde100 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 HEROWANG 的回复:]
偶现在用的2000.
DDL语法在2005以后才能用?
[/Quote]
好像DDL是2005的新特性,2008也有
东那个升 2008-11-07
  • 打赏
  • 举报
回复
2000的没有,2005才有DDL触发器!
  • 打赏
  • 举报
回复
偶现在用的2000.
DDL语法在2005以后才能用?
hyde100 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 HEROWANG 的回复:]
引用 4 楼 hyde100 的回复:
SQL codeCREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK


没有这个语法吧。
CREATE TRIGGER trigger_name
ON { table | view } --这能在表和视图上建立
[/Quote]
这是DDL触发器,你说的是DML触发器
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hyde100 的回复:]
SQL codeCREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK
[/Quote]

没有这个语法吧。
CREATE TRIGGER trigger_name
ON { table | view } --这能在表和视图上建立
hyde100 2008-11-07
  • 打赏
  • 举报
回复
CREATE TRIGGER safety 
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK
hyde100 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fcuandy 的回复:]
ddl触发器
[/Quote]
.
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
ddl触发器
kobe8tn 2008-11-07
  • 打赏
  • 举报
回复
用约束吧
rucypli 2008-11-07
  • 打赏
  • 举报
回复
建个只读的用户权限
Yang_ 2008-11-07
  • 打赏
  • 举报
回复
ddl触发器可以防止误删除

不过如果他有足够权限,他可以先删除你的触发器

所以最彻底的方法是在权限上控制
losfound 2008-11-07
  • 打赏
  • 举报
回复
在说明书里写明,请用户自己注意
定期备份数据库
哈哈
tianhuo_soft 2008-11-07
  • 打赏
  • 举报
回复
做关系

主从关系键 ,依赖与另外一个表
加载更多回复(3)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧