欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[SqlServer01]

程序员文章站 2022-04-06 11:49:20
...

有时候我们希望某些表的数据不能被删除,可以使用下面的触发器。 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