1

5列のテーブルがあります:

  • username( varchar)
  • password( int)
  • access( bit)
  • information( varchar)
  • image( varchar)

informationユーザーが2列に挿入できないimageようにしたいaccess = true.

insert trigger を使用してこれを行う方法はありますか? どんな助けでも素晴らしいでしょう。

4

2 に答える 2

0

INSTEAD OF INSERTtriggerを使用すると、不要な情報を簡単に「除外」できます。たとえば、accessが に設定されている場合は、空の文字列 (またはその他のもの) を挿入でき1ます。

CREATE TRIGGER InsteadTrigger on dbo.YourTableNameHere
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO dbo.YourTableNameHere(username, password, access, information, image)
       SELECT 
           username, password, access,
           CASE access  
              WHEN 1 THEN '' ELSE i.information END,
           CASE access 
              WHEN 1 THEN '' ELSE i.image END
       FROM INSERTED i
END;

したがって、access = 0- で行を挿入すると、すべての列が表示どおりに保存されます。

したがって、access = 1- で行を挿入しようとすると、列informationimage「消去」され、代わりに空の文字列が格納されます。

SQL Server 2008以降では、これをここに挿入します。

INSERT INTO dbo.YourTableNameHere(username, password,access,information, image)
VALUES  ('test 1', 42, 0, 'testinfo 1', 'testimg 1'),
        ('test 2', 4711, 1, 'testinfo 2', 'testimg2')

SELECT * FROM dbo.YourTableNameHere

データベース テーブルに 2 つの行が保存されますが、挿入された 2 番目の行には空informationimage列が含まれます...

于 2013-10-13T08:45:22.397 に答える
0

insert または updateでこの動作が必要な場合は、単純な CHECK 制約で十分です。

ALTER TABLE MySchema.MyTable
ADD CONSTRAINT CK_MyTable_BlockInformationImageWhenAccessIsTrue
CHECK( access = 1 AND information IS NULL AND image IS NULL OR access = 0 );

挿入時にのみこの動作が必要な場合は、次のトリガーを使用できます。

CREATE TRIGGER trgI_MyTable_BlockInformationImageWhenAccessIsTrue
ON MySchema.MyTable
AFTER INSERT
AS
BEGIN
    IF EXISTS
    (
        SELECT * 
        FROM inserted i 
        WHERE i.access = 1 
        AND (information IS NOT NULL OR image IS NOT NULL)
    )
    BEGIN
    ROLLBACK TRANSACTION;
    RAISERROR('Access denied', 16, 1);
    END
END;
GO
于 2013-10-13T08:37:40.473 に答える