Sql 如何使用insert触发器禁用某些列?

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

我有一个有5列的表:

  • 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
将导致两行保存到数据库表中,但插入的第二行将有空的
信息
图像