[SqlServer01]
有时候我们希望某些表的数据不能被删除,可以使用下面的触发器。 Create trigger [dbo].[trg_del] on [dbo].LogInfo instead of delete AS BEGIN declare @cou int select @cou=count(*) from deleted; if (@cou0) RAISERROR('数据不允许删除!', 16, 1) END
有时候我们希望某些表的数据不能被删除,可以使用下面的触发器。
Create trigger [dbo].[trg_del] on [dbo].LogInfo
instead of delete
AS
BEGIN
declare @cou int
select @cou=count(*) from deleted;
if (@cou>0)
RAISERROR('数据不允许删除!', 16, 1)
END
但需要注意 truncate table LogInfo 命令依然会正确执行,因为truncate 不会触发触发器,不会写日志,所以无法回滚,使用时要谨慎。
有时候我们需要灵活指定一些用户可以删除和修改数据表结构,未指定的用户则不能做这些操作,可以使用下面的触发器
CREATE TRIGGER TR_Safety_Table
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
IF( ( SUSER_SNAME() 'sa' )and (SUSER_SNAME() 'test') )
BEGIN
PRINT '你无DROP TABLE 和 ALTER TABLE 的权限!'
ROLLBACK
END
关于数据库或表的权限其实可以通过角色,权限来控制,下面是常用的一些基本语句,写在这里备忘。
--登陆、用户与权限
--删除登陆
--exec sp_droplogin 'test'
--新建登陆
exec sp_addlogin @loginame = N'test',
@passwd = '123456',
@defdb = N'TestDB',
@deflanguage = N'Simplified Chinese',
@sid = NULL,
@encryptopt = NULL
GO
--删除用户
--exec sp_dropuser 'test'
exec sp_adduser 'test'
--授权
GRANT SELECT, INSERT, UPDATE, DELETE
ON LogInfo
TO test
--收回权限
revoke DELETE on LogInfo from test;
--拒绝权限
deny DELETE on LogInfo TO test;
--授予角色权限
--exec sp_addrolemember 'db_owner','test'
--列出全部表名
--select name from sysobjects where xtype = 'U' order by name