Sql 如何使用insert触发器禁用某些列?
我有一个有5列的表:Sql 如何使用insert触发器禁用某些列?,sql,sql-server,triggers,Sql,Sql Server,Triggers,我有一个有5列的表: username(varchar) 密码(int) 访问(位) 信息(varchar) image(varchar) 如果access=true,我想阻止用户插入到两列信息和图像 是否仍然可以使用插入触发器执行此操作?任何帮助都会很好 如果在插入或更新时需要此行为,一个简单的检查约束就足够了: ALTER TABLE MySchema.MyTable ADD CONSTRAINT CK_MyTable_BlockInformationImageWhenAccessIsT
(username
)varchar
(密码
)int
(访问
)位
(信息
)varchar
(image
)varchar
access=true
,我想阻止用户插入到两列信息
和图像
是否仍然可以使用插入触发器执行此操作?任何帮助都会很好 如果在插入或更新时需要此行为,一个简单的检查约束就足够了:
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
使用,您可以轻松地“过滤”不需要的信息,例如,如果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;
因此,如果插入一行,访问权限为0,则所有列都会按显示的方式存储
因此,如果您尝试插入一行access=1
,则列信息
和图像
将被“清除”,并存储一个空字符串
在SQL Server2008及更新版本上,此处插入:
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
将导致两行保存到数据库表中,但插入的第二行将有空的信息
和图像
列