我想让一个网站充当数据库中某个表的监视器,或者作为该表上的监听器
例如,假设我有桌子员工
我想建立一个网页来监听该表上发生的变化(所有DML操作)
每当插入记录时,我希望此页面提醒我“表格员工中插入了1行”,或者更新了我想要提醒“行号xx已更新”等等
那么这样做的最佳做法是什么
日Thnx
答案 0 :(得分:3)
这是使这个解决方案成为可能/简单/健壮的关键部分。每次employee表进行更新或插入时,您都需要创建一个写入另一个表(tblEmployeeChanges)的db trigger。因此,如果在特定时刻他们对employee表进行了5次更改,tblEmployeeChanges会有新的5条记录,如下所示:
EmployeeChangeID ChangeType EmployeeID ChangeTime
1643 Insert 434243 2010-07-23 09:14:04
1644 Update 345345 2010-07-23 09:14:07
1645 Insert 345347 2010-07-23 09:14:21
1646 Update 345438 2010-07-23 09:14:39
1647 Update 435634 2010-07-23 09:14:41
您监控网页会每隔几秒钟检查一次这个表,或者无论您希望如何(当用户点击“刷新”按钮时),您的网页将获取此数据并显示它。
这个表可能会变得非常大,但是使用好的索引会保持相当高效。您可以随时轻松清除“旧数据”。您将拥有EmployeeChangeID或ChangeTime上的聚簇索引,因此不应该进行常量添加,并且查询不应该是一个大问题。
创建一个带有EmployeeChangeID的.asmx页面或简单的wcf服务,并发送每个具有大于该记录的EmployeeChangeID的tblEmployeeChanges记录的信息。
每个,比方说,2秒,您的网页页面会发送页面知道的最后一个EmployeeChangeID。如果有任何新行,您的回调函数会将它们添加到显示中(供人查看),发出蜂鸣声或其他内容,并将列表中最后一个更改记录的ID写入javascript变量或隐藏输入,在下一个ajax调用中使用(2秒后)。
因此,在9:14:38,您的页面会询问自更改1645以来的所有更改,并且什么都不返回。然后在9:14:40,(换1646);您的页面显示该数据。然后在9:14:42你的页面要求1646年之后的每一个变化,什么都不回来等等。
我并不特别喜欢触发器,有时会在没有使用触发器的情况下使用数月。但在这种情况下,这是必要的。请注意,如果您确实需要跟踪系统中的更改,最好建立一个架构,其中每个更改都会跟踪所有值,并且每个员工的每个属性都保存在键值对表中,其中最新值为被认为是“活跃”的价值。这种架构有优点和缺点,可能不适合您。但是,如果架构认为跟踪更改是事后的想法,那么跟踪更改将不得不像使用db触发器这样的工具,作为事后的想法进行处理。
答案 1 :(得分:0)
您不仅可以将网页设为“侦听”,因为网页只会按需执行其代码。有些东西必须访问页面才能执行(你可以让页面自己刷新,但你必须在浏览器中打开它,或者由程序访问)。您需要创建一个服务,或者一个计划任务,它可以ping数据库并检查更改,也可以ping网页以检查数据库。
编辑:这是我想说的 您有两种类型的通知,推送与拉取。从网页访问信息是拉动通知。您必须访问该页面才能获取信息。只要您访问该页面,您就可以继续接收更新,但是当您停止时,您将不再收到更改时的通知。
这与每次发送电子邮件形成鲜明对比。您可以拥有一项服务,在更新表格时(寻呼机,电子邮件等)向其他系统发送通知。网页不能单独执行此操作。
如果您想要拉取通知,网页可以做到这一点没问题,但是当您停止访问该页面时,您将无法收到有关更新的通知。如果这是你想要的,只需要刷新页面或者ajax请求ping一些检查数据库的服务器端代码,但是这种方法不适用于你何时需要知道的事情。
或者,您可以在SQL Server中创建一个触发器,每次更新表时都会发出通知。如果您想从页面访问信息,这不是可行的方法,但如果您希望收到通知说是电子邮件,那么您可以触发一个触发器。 (当您需要推送通知时,这是一个解决方案)。如果您实施了彗星解决方案,则可以使用触发器更新网页,但可能有更简单的方法。
答案 2 :(得分:0)
SQLDependency
是您可以寻找的。 p>
答案 3 :(得分:0)
RSS将更改提供给您MS Outlook或手机。也就是说,编写一个存储过程,返回新的过程并将其放在您可以订阅的RSS源上。我在VS 2010中展示如何执行此操作的博客是HERE.