SQL2008 创建个用户 去掉drop表的权限

时间:2021-07-07 13:28:55
新创建个用户 只能访问一个库。 给了db_owner权限,     现在想让这个表不能删除删除表,我弄了个触发器
create TRIGGER TR_Safety_Table 
ON DATABASE 
FOR DROP_TABLE,  DROP_trigger
AS 
IF( ( SUSER_SNAME() <>'sa' ) )
   BEGIN
   PRINT '你无DROP TABLE 和 ALTER TABLE 的权限!' 
   ROLLBACK
END

发现根本没什么用,    然后我把SA禁用了,   发现没什么用,  我用新的这个账号也能删除这个触发器。 在删除的时候好像没触发DROP_trigger。 
请问如果 给用户设置  让他不能删除表

6 个解决方案

#1


不要授予db_owner权限,维护时用存储过程,直接给存储过程授权
或针对数据库授权
use [Test]
GO
GRANT SELECT TO [A]
GO
use [Test]
GO
GRANT REFERENCES TO [A]
GO
use [Test]
GO
GRANT EXECUTE TO [A]
GO

#2


引用 1 楼 roy_88 的回复:
不要授予db_owner权限,维护时用存储过程,直接给存储过程授权
或针对数据库授权
use [Test]
GO
GRANT SELECT TO [A]
GO
use [Test]
GO
GRANT REFERENCES TO [A]
GO
use [Test]
GO
GRANT EXECUTE TO [A]
GO

你这都是什么意思

#3


create TRIGGER TR_Safety_Table 
ON  ALL SERVER  
FOR DROP_TABLE,  DROP_trigger
AS 
IF( ( SUSER_SNAME() <>'sa' ) )
   BEGIN
   PRINT '你无不能删除表!' 
   ROLLBACK
END
我用SA创建了全局触发器,   这个问题貌似解决了。  因为我新创建的用户 删除不了 全局的这个触发器。   变现的实现了。 但是还是觉得不完美

#4


ON DATABASE--这是数据库级的检查,限定某个数据库(表和表级触发器操作)
ON ALL SERVER--这是实例级的检查,针对所有数据库操作

你设置了用ALL SERVER,就没必要再创建DATABASE触发器了

#5


个人建议,这类针对权限的操作能实现的,最好用权限去设置限制
如:登陆之类防入侵可用登陆触发器去限制

#6


你这样实现没问题,ON DATABASE --为数据库级 的解发器,只能服务级触发器去限制,当登陆账号为管理员权限时一样可删除服务器触发器
你用了ALL SERVER就没必要再用DATABASE去嵌套触发,除非你再判断删除的触发器名,用函数EVENTDATA去判断命令

#1


不要授予db_owner权限,维护时用存储过程,直接给存储过程授权
或针对数据库授权
use [Test]
GO
GRANT SELECT TO [A]
GO
use [Test]
GO
GRANT REFERENCES TO [A]
GO
use [Test]
GO
GRANT EXECUTE TO [A]
GO

#2


引用 1 楼 roy_88 的回复:
不要授予db_owner权限,维护时用存储过程,直接给存储过程授权
或针对数据库授权
use [Test]
GO
GRANT SELECT TO [A]
GO
use [Test]
GO
GRANT REFERENCES TO [A]
GO
use [Test]
GO
GRANT EXECUTE TO [A]
GO

你这都是什么意思

#3


create TRIGGER TR_Safety_Table 
ON  ALL SERVER  
FOR DROP_TABLE,  DROP_trigger
AS 
IF( ( SUSER_SNAME() <>'sa' ) )
   BEGIN
   PRINT '你无不能删除表!' 
   ROLLBACK
END
我用SA创建了全局触发器,   这个问题貌似解决了。  因为我新创建的用户 删除不了 全局的这个触发器。   变现的实现了。 但是还是觉得不完美

#4


ON DATABASE--这是数据库级的检查,限定某个数据库(表和表级触发器操作)
ON ALL SERVER--这是实例级的检查,针对所有数据库操作

你设置了用ALL SERVER,就没必要再创建DATABASE触发器了

#5


个人建议,这类针对权限的操作能实现的,最好用权限去设置限制
如:登陆之类防入侵可用登陆触发器去限制

#6


你这样实现没问题,ON DATABASE --为数据库级 的解发器,只能服务级触发器去限制,当登陆账号为管理员权限时一样可删除服务器触发器
你用了ALL SERVER就没必要再用DATABASE去嵌套触发,除非你再判断删除的触发器名,用函数EVENTDATA去判断命令