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
你这都是什么意思
#3
create TRIGGER TR_Safety_Table
ON ALL SERVER
FOR DROP_TABLE, DROP_trigger
AS
IF( ( SUSER_SNAME() <>'sa' ) )
BEGIN
PRINT '你无不能删除表!'
ROLLBACK
END
我用SA创建了全局触发器, 这个问题貌似解决了。 因为我新创建的用户 删除不了 全局的这个触发器。 变现的实现了。 但是还是觉得不完美
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触发器了
ON ALL SERVER--这是实例级的检查,针对所有数据库操作
你设置了用ALL SERVER,就没必要再创建DATABASE触发器了
#5
个人建议,这类针对权限的操作能实现的,最好用权限去设置限制
如:登陆之类防入侵可用登陆触发器去限制
如:登陆之类防入侵可用登陆触发器去限制
#6
你这样实现没问题,ON DATABASE --为数据库级 的解发器,只能服务级触发器去限制,当登陆账号为管理员权限时一样可删除服务器触发器
你用了ALL SERVER就没必要再用DATABASE去嵌套触发,除非你再判断删除的触发器名,用函数EVENTDATA去判断命令
你用了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
你这都是什么意思
#3
create TRIGGER TR_Safety_Table
ON ALL SERVER
FOR DROP_TABLE, DROP_trigger
AS
IF( ( SUSER_SNAME() <>'sa' ) )
BEGIN
PRINT '你无不能删除表!'
ROLLBACK
END
我用SA创建了全局触发器, 这个问题貌似解决了。 因为我新创建的用户 删除不了 全局的这个触发器。 变现的实现了。 但是还是觉得不完美
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触发器了
ON ALL SERVER--这是实例级的检查,针对所有数据库操作
你设置了用ALL SERVER,就没必要再创建DATABASE触发器了
#5
个人建议,这类针对权限的操作能实现的,最好用权限去设置限制
如:登陆之类防入侵可用登陆触发器去限制
如:登陆之类防入侵可用登陆触发器去限制
#6
你这样实现没问题,ON DATABASE --为数据库级 的解发器,只能服务级触发器去限制,当登陆账号为管理员权限时一样可删除服务器触发器
你用了ALL SERVER就没必要再用DATABASE去嵌套触发,除非你再判断删除的触发器名,用函数EVENTDATA去判断命令
你用了ALL SERVER就没必要再用DATABASE去嵌套触发,除非你再判断删除的触发器名,用函数EVENTDATA去判断命令