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)
*/