我有一个包含5列的表格:
username
(varchar
)password
(int
)access
(bit
)information
(varchar
)image
(varchar
)如果information
,我想阻止用户插入2列image
和access = true
。
无论如何使用插入触发器来执行此操作?任何帮助都会很棒。
答案 0 :(得分:0)
如果您在插入或更新时需要此行为,则一个简单的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
答案 1 :(得分:0)
使用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
会导致两行保存到数据库表中,但插入的第二行将包含空information
和image
列...