首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql server的一道简单有关问题但是初学者如何也不会改

2013-06-19 
sql server的一道简单问题但是菜鸟怎么也不会改题目:Create an event notification that records every at

sql server的一道简单问题但是菜鸟怎么也不会改
题目:

Create an event notification that records every attempt to create or drop a table in the Sales schema in the AdventureWorks database. Store the information in a log table by a stored procedure invoked by a Service Broker service.



我的代码:
USE AdventureWorks
ALTER DATABASE AdventureWorks SET ENABLE_BROKER
GO

CREATE TABLE Sales.LogTable
(EventName varchar(10),TableName varchar(10))
GO

CREATE PROC Sales.LogProc
AS
  DECLARE @message_body XML,@message_type_name NVARCHAR(256),@dialog UNIQUEIDENTIFIER;
BEGIN
  WAITFOR (
     RECEIVE TOP(1)
     @dialog=conversation_handle,
         @message_type_name=message_type_name,
     @message_body=message_body
     FROM Sales.NotifyQueue
 ),TIMEOUT 100;
     INSERT INTO Sales.LogTable(EventName,TableName)
 VALUES(
 CAST(@message_body.query('/EVENT_INSTANCE/EventName/text()')AS varchar(10)),
 CAST(@message_body.query('/EVENT_INSTANCE/TableName/text()')AS varchar(10)))
END
GO

CREATE QUEUE Sales.NotifyQueue
WITH ACTIVATION(
   STATUS=ON,
   PROCEDURE_NAME=Sales.LogProc,
   MAX_QUEUE_READERS=10,
   EXECUTE AS SELF)
GO

CREATE SERVICE NotifyService
ON QUEUE Sales.NotifyQueue
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO

CREATE ROUTE NotifyRoute
WITH SERVICE_NAME='NotifyService',
ADDRESS='LOCAL'
GO

CREATE EVENT NOTIFICATION NotifyCREATE_TABLE
ON DATABASE
FOR CREATE_TABLE
TO SERVICE 'NotifyService', 'current database'
GO

CREATE EVENT NOTIFICATION NotifyDROP_TABLE
ON DATABASE
FOR DROP_TABLE
TO SERVICE 'NotifyService', 'current database'
GO



CREATE TABLE Sales.Test(col1 int)
GO

SELECT * FROM Sales.LogTable



出来的结果没有报错,但是什么都没留在LOGTABLE里,请问怎么修改,谢谢 SQL?Server XML 数据库
[解决办法]


create database AdventureWorks


use AdventureWorks


alter database AdventureWorks set enable_broker


alter database AdventureWorks set trustworthy on


create schema Sales


create table Sales.LogTable
(EventName varchar(10),
 TableName varchar(10)
)


create proc Sales.LogProc
as
begin


 declare @message_body xml,
         @message_type_name sysname,
         @dialog uniqueidentifier;

 waitfor(
     receive top(1)
      @dialog=conversation_handle,
      @message_type_name=message_type_name,
      @message_body=message_body
     from Sales.NotifyQueue),timeout 1000;

 insert into Sales.LogTable(EventName,TableName)
  select o.value('EventType[1]','varchar(10)'),
         o.value('ObjectName[1]','varchar(10)')
   from (select @message_body 'message_body') t
   cross apply message_body.nodes('/EVENT_INSTANCE') x(o)
end


create queue Sales.NotifyQueue
with activation
( status=on,
  procedure_name=Sales.LogProc,
  max_queue_readers=10,
  execute as self )


create service NotifyService
on queue Sales.NotifyQueue
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])


create route NotifyRoute
with service_name='NotifyService',address='LOCAL'


create event notification NotifyCREATE_TABLE
on database for CREATE_TABLE
to service 'NotifyService', 'current database'


create event notification NotifyDROP_TABLE
on database for DROP_TABLE
to service 'NotifyService', 'current database'


-- 测试
create table Sales.Test4(col1 int)

drop table Sales.Test4

create table Sales.Test3(col1 int)


-- 结果
select EventName,TableName from Sales.LogTable

/*
EventName    TableName
----------   ----------
CREATE_TAB   Test4
DROP_TABLE   Test4
CREATE_TAB   Test3

(3 row(s) affected)
*/

热点排行