首页  :: 联系 :: 订阅 订阅  :: 管理

脏字过滤解决方案

Posted on 2010-01-06 16:26  李海  阅读(898)  评论(0编辑  收藏  举报

1、建立脏字表

USE [hongdongwebdb]

GO

/****** 对象: Table [dbo].[DirtyList]    脚本日期: 01/04/2010 16:05:52 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[DirtyList](

    [DirtyList] [text] COLLATE Chinese_PRC_CI_AS NOT NULL

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'脏字字典' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'DirtyList', @level2type=N'COLUMN', @level2name=N'DirtyList'

 

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N' 脏字字典' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'DirtyList'

数据表内容请打开附加查看

2、部署脏字过滤项目

先打开项目,右击项目选择属性,在属性页配置过滤要过滤脏字的数据库


选择完后右击项目点击部署就部署到相应的数据库。

若部署成功的话会在数据库以下图示位置看到FilterDirty函数。

3、根据要过滤的表和字段写相应的触发器

   以评论表comment为例,假如要过滤字段titlecontent字段书写触发器代码如下:

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

 

CREATE TRIGGER [TR_Blog_Journal_Comment_Filter] ON [dbo].[Comment]

    FOR UPDATE, INSERT

AS

    DECLARE @temp NVARCHAR(MAX)

    DECLARE @ID INT

    SELECT @temp = dirtylist

    FROM    dirtylist    

    SELECT @ID = ID

    FROM    InserteD     

    UPDATE dbo.Comment

SET     Content = dbo.filterdirty(ISNULL(Contents, ''), @temp)

        Title = dbo.filterdirty(ISNULL(Title, ''), @temp)

    WHERE   ID = @ID 

这样在向数据库中添加有脏字记录的时候就会把脏字替换成*

4、关于sql数据库上部署程序集

--开启数据库CLR功能

EXEC sp_configure 'show advanced options', '1' ;

go

RECONFIGURE ;

go

EXEC sp_configure 'clr enabled', '1'

go

RECONFIGURE ;

EXEC sp_configure 'show advanced options', '1' ;

go

 

 

 

--判断是否存在此程序集,若存在则删除

IF EXISTS ( SELECT *

            FROM    sys.assemblies

            WHERE   NAME = 'SqlClassLibrary' )

    BEGIN

            --删除程序集之前先判断此程序集是否被函数引用

        IF ( EXISTS ( SELECT    *

                      FROM      sysobjects

                      WHERE     TYPE = 'fs'

                                AND NAME = 'FilterDirty' ) )

            DROP FUNCTION   [FilterDirty]           

        DROP ASSEMBLY [SqlClassLibrary]             

    END          

GO

--给相应数据库注册程序集

CREATE ASSEMBLY [SqlClassLibrary] --程序集的位置

    FROM 'F:\cb\脏字过滤方案\SqlClassLibrary.dll'

--程序集所执行的代码将无法访问外部系统资源

    WITH PERMISSION_SET = SAFE  

GO

 

 

--建立函数若存在此函数则删除

IF ( EXISTS ( SELECT    *

              FROM      sysobjects

              WHERE     TYPE = 'fs'

                        AND NAME = 'FilterDirty' ) )

    DROP FUNCTION   [FilterDirty]

GO

 

CREATE FUNCTION [dbo].[FilterDirty]

    (

      @input [nvarchar](MAX),

      @filterDirty [nvarchar](MAX)

    )

RETURNS [nvarchar](4000)

    WITH EXECUTE AS CALLER

AS EXTERNAL NAME

    [SqlClassLibrary].[UserDefinedFunctions].[FilterDirty]

GO

相关源码下载