1

複数のソースから選択したファイルをカタログ化するテーブルがあります。新しいファイルがカタログ化されたときに、ファイルが以前にカタログ化されたファイルの複製であるかどうかを記録したいと思います。テーブルに列(「primary_duplicate」)があり、各エントリを「P」(プライマリ)または「D」(重複)として記録します。新しいファイルが記録されているときに、このファイルの他の出現(つまり、名前、長さ、タイムスタンプ)をチェックする、この列のデフォルトのバインディングを提供したいと思います。

このチェックを実行する関数を作成しました(以下の「GetPrimaryDuplicate」を参照)。しかし、デフォルトのバインドとしてテーブルの「primary_duplicate」列に3つのパラメーターを必要とするこの関数をバインドする方法がわかりません。

トリガーの使用は避けたい。現在、このチェックを実行する新しいレコードを挿入するために使用されるストアドプロシージャがあります。ただし、このストアドプロシージャの外部で挿入が実行された場合は、フラグが正しく設定されていることを確認したいと思います。

挿入されている行の値を使用してこの関数を呼び出すにはどうすればよいですか?

USE [MyDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[FileCatalog](
    [id] [uniqueidentifier] NOT NULL,
    [catalog_timestamp] [datetime] NOT NULL,
    [primary_duplicate] [nchar](1) NOT NULL,
    [name] [nvarchar](255) NULL,
    [length] [bigint] NULL,
    [timestamp] [datetime] NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[FileCatalog] ADD  CONSTRAINT [DF_FileCatalog_id]  DEFAULT (newid()) FOR [id]
GO

ALTER TABLE [dbo].[FileCatalog] ADD  CONSTRAINT [DF_FileCatalog_catalog_timestamp]  DEFAULT (getdate()) FOR [catalog_timestamp]
GO

ALTER TABLE [dbo].[FileCatalog] ADD  CONSTRAINT [DF_FileCatalog_primary_duplicate]  DEFAULT (N'GetPrimaryDuplicate(name, length, timestamp)') FOR [primary_duplicate]
GO


USE [MyDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[GetPrimaryDuplicate] 
(
    @name nvarchar(255),
    @length bigint,
    @timestamp datetime
)
RETURNS nchar(1)
AS 
BEGIN

    DECLARE @c int

    SELECT @c = COUNT(*)
    FROM FileCatalog
    WHERE name=@name and length=@length and timestamp=@timestamp and primary_duplicate = 'P'

    IF @c > 0
        RETURN 'D' -- Duplicate

    RETURN 'P' -- Primary

END

GO
4

3 に答える 3

2

ジョン、それは質問への答えではありません、そして彼が引き金を使うべきであると仮定することはあなたのひどく思いがけないことです。彼が何をしようとしているのか、デフォルト値でそれをやりたいと思う理由がわからない。

それが不可能な場合は、「それは不可能なので、代わりにトリガーを使用する必要があります」と言った可能性があります。そうすれば、彼は実際に何かを学ぶことができます。彼はあなたと同じように、トリガーとは何か、そしてそれらが何に使用できるかを知っていると確信しています。

OP:申し訳ありませんが、同じ情報を検索しています。

于 2010-10-25T18:41:05.493 に答える
1

代わりにトリガーを使用する必要があります。トリガーは、挿入された行のコピーを受け取ります。

于 2010-03-27T06:01:02.913 に答える