首页 > 解决方案 > DJANGO 使用 SQLSERVER 如何触发程序?

问题描述

我在大学的一个 DJANGO 项目中使用 SQLSERVER 作为数据库,我需要通过 DJANGO 触发我的触发器和程序,我一直在寻找几天来做到这一点,但我做不到,谁能帮助我?

标签: sql-serverdjangostored-procedurestriggers

解决方案


万一其他人最终出现在此页面上,这就是我设法做到这一点的方式……我对问题的解释是如何在数据库端对数据库触发器功能进行操作。我的数据库后端是 PostgreSQL,但 SQL 是一个标准,对 MySQL 和其他的查询应该大致相同)。

解决方案相对简单。一旦你做你的第一个

python manage.py makemigrations
python manage.py migrate

转到您选择的数据库管理器并查找生成您希望在其上使用触发器的表的 SQL 查询。

例如,您的public.auth.users表创建查询可能如下所示:

CREATE TABLE public.auth_user
(
    id integer NOT NULL DEFAULT nextval('auth_user_id_seq'::regclass),
    password character varying(128) COLLATE pg_catalog."default" NOT NULL,
    last_login timestamp with time zone,
    is_superuser boolean NOT NULL,
    username character varying(150) COLLATE pg_catalog."default" NOT NULL,
    first_name character varying(30) COLLATE pg_catalog."default" NOT NULL,
    last_name character varying(150) COLLATE pg_catalog."default" NOT NULL,
    email character varying(254) COLLATE pg_catalog."default" NOT NULL,
    is_staff boolean NOT NULL,
    is_active boolean NOT NULL,
    date_joined timestamp with time zone NOT NULL,
    CONSTRAINT auth_user_pkey PRIMARY KEY (id),
    CONSTRAINT auth_user_username_key UNIQUE (username)

)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

假设您想要一个触发器来将每条新记录的 last_name 更改为值“Trump”(不带引号)。创建触发函数的代码如下所示(注意这些RAISE NOTICE行只是将信息回显到 SQL 终端以进行调试。您可以通过在它们前面添加双破折号来将它们注释掉,例如--RAISE NOTICE 'id = % ', NEW.id;):

CREATE OR REPLACE FUNCTION trumpisizer() RETURNS trigger AS $$
BEGIN
        RAISE NOTICE 'last_name = % ', NEW.last_name;
        NEW.last_name = 'Trump';
        RAISE NOTICE 'last_name = % ', NEW.last_name;
        RETURN NEW;
END;
$$ LANGUAGE plpgsql;

现在您需要将您的函数绑定到您的表。这样做的这个 SQL 查询是这样的:

CREATE TRIGGER trumpist BEFORE INSERT ON auth_user FOR EACH ROW EXECUTE PROCEDURE trumpisizer();

现在加载您的 django 应用程序并创建一个新用户。每个新用户的 last_name 都将更改为新值。


推荐阅读