C# 通过asp.net将参数传递给sql触发器

C# 通过asp.net将参数传递给sql触发器,c#,asp.net,sql-server-2008,entity-framework-4,triggers,C#,Asp.net,Sql Server 2008,Entity Framework 4,Triggers,问一个非常愚蠢的问题。实际上,我想在最近任何用户插入、更新和删除记录时跟踪我的数据库 我创建触发器是为了跟踪任何数据库更改 这是我的sql触发器 USE [test] GO /****** Object: Trigger [dbo].[tr_trigtest1] Script Date: 09/05/2012 16:31:18 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].

问一个非常愚蠢的问题。实际上,我想在最近任何用户插入、更新和删除记录时跟踪我的数据库

我创建触发器是为了跟踪任何数据库更改

这是我的sql触发器

    USE [test]
GO
/****** Object:  Trigger [dbo].[tr_trigtest1]    Script Date: 09/05/2012 16:31:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_trigtest1] ON [dbo].[test1] FOR INSERT, UPDATE, DELETE
AS

DECLARE @bit INT ,
       @field INT ,
       @maxfield INT ,
       @char INT ,
       @fieldname VARCHAR(128) ,
       @TableName VARCHAR(128) ,
       @PKCols VARCHAR(1000) ,
       @sql VARCHAR(2000), 
       @UpdateDate VARCHAR(21) ,
       @UserName VARCHAR(128) ,
       @Type CHAR(1) ,
       @PKSelect VARCHAR(1000)


--You will need to change @TableName to match the table to be audited
SELECT @TableName = 'trigtest'

-- date and user
SELECT         @UserName = @UserName ,
       @UpdateDate = CONVERT(VARCHAR(8), GETDATE(), 112) 
               + ' ' + CONVERT(VARCHAR(12), GETDATE(), 114)

-- Action
IF EXISTS (SELECT * FROM inserted)
       IF EXISTS (SELECT * FROM deleted)
               SELECT @Type = 'U'
       ELSE
               SELECT @Type = 'I'
ELSE
       SELECT @Type = 'D'

-- get list of columns
SELECT * INTO #ins FROM inserted
SELECT * INTO #del FROM deleted

-- Get primary key columns for full outer join
SELECT @PKCols = COALESCE(@PKCols + ' and', ' on') 
               + ' i.' + c.COLUMN_NAME + ' = d.' + c.COLUMN_NAME
       FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,

              INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
       WHERE   pk.TABLE_NAME = @TableName
       AND     CONSTRAINT_TYPE = 'PRIMARY KEY'
       AND     c.TABLE_NAME = pk.TABLE_NAME
       AND     c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

-- Get primary key select for insert
SELECT @PKSelect = COALESCE(@PKSelect+'+','') 
       + '''<' + COLUMN_NAME 
       + '=''+convert(varchar(100),
coalesce(i.' + COLUMN_NAME +',d.' + COLUMN_NAME + '))+''>''' 
       FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
               INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
       WHERE   pk.TABLE_NAME = @TableName
       AND     CONSTRAINT_TYPE = 'PRIMARY KEY'
       AND     c.TABLE_NAME = pk.TABLE_NAME
       AND     c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

IF @PKCols IS NULL
BEGIN
       RAISERROR('no PK on table %s', 16, -1, @TableName)
       RETURN
END

SELECT         @field = 0, 
       @maxfield = MAX(ORDINAL_POSITION) 
       FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName
WHILE @field < @maxfield
BEGIN
       SELECT @field = MIN(ORDINAL_POSITION) 
               FROM INFORMATION_SCHEMA.COLUMNS 
               WHERE TABLE_NAME = @TableName 
               AND ORDINAL_POSITION > @field
       SELECT @bit = (@field - 1 )% 8 + 1
       SELECT @bit = POWER(2,@bit - 1)
       SELECT @char = ((@field - 1) / 8) + 1
       IF SUBSTRING(COLUMNS_UPDATED(),@char, 1) & @bit > 0
                                       OR @Type IN ('I','D')
       BEGIN
               SELECT @fieldname = COLUMN_NAME 
                       FROM INFORMATION_SCHEMA.COLUMNS 
                       WHERE TABLE_NAME = @TableName 
                       AND ORDINAL_POSITION = @field
               SELECT @sql = '
insert Audit (    Type, 
               TableName, 
               PK, 
               FieldName, 
               OldValue, 
               NewValue, 
               UpdateDate, 
               UserName)
select ''' + @Type + ''',''' 
       + @TableName + ''',' + @PKSelect
       + ',''' + @fieldname + ''''
       + ',convert(varchar(1000),d.' + @fieldname + ')'
       + ',convert(varchar(1000),i.' + @fieldname + ')'
       + ',''' + @UpdateDate + ''''
       + ',''' + @UserName + ''''
       + ' from #ins i full outer join #del d'
       + @PKCols
       + ' where i.' + @fieldname + ' <> d.' + @fieldname 
       + ' or (i.' + @fieldname + ' is null and  d.'
                                + @fieldname
                                + ' is not null)' 
       + ' or (i.' + @fieldname + ' is not null and  d.' 
                                + @fieldname
                                + ' is null)' 
               EXEC (@sql)
       END
END

所以现在我遇到了一个问题。是否可以通过后端代码将值传递给@username?如何修改触发器?对不起,我对sql触发器仍然很熟悉。我不知道如何修改它

用户名是由函数
SUser\u SName()返回的


实际返回的值取决于EF连接字符串

用户名由函数
SUser\u SName()返回。


实际返回的值取决于EF连接字符串

那个么,是否可以通过后端代码将值传递给@username?很抱歉,我仍然需要sql触发器。我不知道如何修改trugger是的,你可以。但你可能不应该。只需将
选择@UserName=@UserName,
行更改为上面的一行。那么是否可以通过后端代码将值传递给@UserName?很抱歉,我仍然需要sql触发器。我不知道如何修改trugger是的,你可以。但你可能不应该。只需将
SELECT@UserName=@UserName,
行更改为上面的一行。通过构建动态sql,该触发器将使表上的写操作非常缓慢。为什么不使用DDL动态创建静态触发器呢?嗨,noonb,能给我举个例子吗?对于sql触发器,我还是很新的。通过构建动态sql,该触发器将使表上的写操作非常慢。为什么不使用DDL动态创建静态触发器呢?嗨,noonb,能给我举个例子吗?我对sql触发器还是很陌生的
public partial class WebForm1 : System.Web.UI.Page
{
    private testEntities entity = new testEntities();
    protected void Page_Load(object sender, EventArgs e)
    {
        trigtest test = trigtest.Createtrigtest(10, 12);
       entity.AddTotrigtests(test);
        entity.SaveChanges();
    }
}
SELECT @UserName = SUser_SName();