複数のソースから選択したファイルをカタログ化するテーブルがあります。新しいファイルがカタログ化されたときに、ファイルが以前にカタログ化されたファイルの複製であるかどうかを記録したいと思います。テーブルに列(「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