SQL。。(答案满意50分) 删除指定表的触发器求助。。

来源:百度知道 编辑:UC知道 时间:2024/05/10 17:04:56
create trigger safety
on database
for drop_table
as
declare @data xml
declare @schemaname nvarchar(max)
declare @tablename nvarchar(max)
set @data=eventdata()
select @schemaname=eventdata().value('(/EVENT_INSTANCE/SCHEMANAME)[1]','nvarchar(max)')
select @tablename=eventdata().value('(/EVENT_INSTANCE/OBJECTNAME)[1]','nvarchar(max)')

if @schemaname='dbo'and @tablename='a'
raiserror('你不能删除该表',16,1)
rollback tran

以下三句我不理解:

set @data=eventdata()
select @schemaname=eventdata().value('(/EVENT_INSTANCE/SCHEMANAME)[1]','nvarchar(max)')
select @tablename=eventdata().value('(/EVENT_INSTANCE/OBJECTNAME)[1]','nvarchar(max)')

请详细指教一下^_^

还有就是建了以后我不能删除任何表了。。晕。。但是它又不显示“你不能删除该表”。。我想知道它的schema 是什么意思?我建立表后在SSMS中看到的表是dbo.a。。。要怎么改才能指定不能删除表A,但可以删除其它表呢?

SQL Server 2005/2008中可以使用EVENTDATA函数来获取DDL触发器的上下文,从而在ROLLBACK之前截获DDL信息。
后面2句,一个就是获得当前数据库的schema,另一个是获得当前操作的表名。

后面的句子的目的就是防止该表所在库的dbo勿删了表 a.