标签归档:数据库触发器

mssql sqlserver 禁止删除数据表的方法分享


摘要:
下文讲述数据库中禁止删除数据表的方法分享,如下所示:
实验环境:sql server 2008 R2


为了避免用户误输sql命令,导致相应的数据表被删除,导致数据库灾难的发生,下文将举例
采用ddl触发器避免用户误删数据表的方法分享。
例:

   create trigger  stopDeleteTable
   on database 
    for drop_table   
    as 
      print N'禁止删除相关数据表!'
      rollback;
     go
     ---以上sql脚本创建了一个数据库触发器器,并对drop表命令进行了监控,
     ---当我们执行删除表命令时,此时会提示相关的禁止删除的错误消息。

mssql sqlserver 自动备份存储过程的方法分享


摘要:
为了更好的记录数据库中存储过程脚本的变化情况,下文采用数据库触发器来自动记载每次“存储过程”的变化(新增或修改),如下所示:
实验环境:sql server 2008 R2


处理方法:
1 .master数据库下建立数据表:
procBackTableInfo,包含列

    CREATE TABLE [procBackTableInfo](
    [keyId [int] IDENTITY(1,1) NOT NULL PRIMARY KEY ,--编号
    [dbName]  sysname,--数据库名
    [procSqlInfo] [ntext] NOT NULL,--存储过程的SQL
    [ProcName]  sysname,--存储过程名字
    [writeDate] [datetime] default getdate(),--修改时间
    [writeUser] sysname   null --写入人
  )
   

2. 建立数据库触发器,tr_procChange

   create trigger [tr_procChange]
on all server  
for CREATE_PROCEDURE,ALTER_PROCEDURE

as 
  --获取事件数据
  DECLARE @data XML
  SET @data = EVENTDATA()

  declare @dbName sysname
  declare @procName sysname
  declare @procSqlInfo nvarchar(max)

  --获取新建存储过程的数据库名
  SET @dbName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')
  --存储过程的名字
  set @procName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
  --获取新建存储过程的内容
  set @procSqlInfo = @data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'sysname')

  --将数据库名、存储过程名以及存储过程内容插入ProcSqlTable表
  insert into [master].[dbo].[procBackTableInfo]([dbName],[ProcName],[ProcSQL]) 
  values(@dbName,@procName,@procSqlInfo)

GO

ENABLE TRIGGER [tr_procChange] ON ALL SERVER