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为例,假如要过滤字段title和content字段书写触发器代码如下:
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
相关源码下载