5列のテーブルがあります:
username
(varchar
)password
(int
)access
(bit
)information
(varchar
)image
(varchar
)
information
ユーザーが2列に挿入できないimage
ようにしたいaccess = true
.
insert trigger を使用してこれを行う方法はありますか? どんな助けでも素晴らしいでしょう。
5列のテーブルがあります:
username
( varchar
)password
( int
)access
( bit
)information
( varchar
)image
( varchar
)information
ユーザーが2列に挿入できないimage
ようにしたいaccess = true
.
insert trigger を使用してこれを行う方法はありますか? どんな助けでも素晴らしいでしょう。
INSTEAD OF INSERT
triggerを使用すると、不要な情報を簡単に「除外」できます。たとえば、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
- で行を挿入しようとすると、列information
がimage
「消去」され、代わりに空の文字列が格納されます。
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 番目の行には空information
のimage
列が含まれます...
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