读书人

sql server的一道简单有关问题但是初学

发布时间: 2013-06-19 10:26:41 作者: rapoo

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

读书人网 >SQL Server

热点推荐